<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.4.0">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/favicon.ico">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon.ico">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon.ico">
  <link rel="mask-icon" href="/images/favicon.ico" color="#222">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/all.min.css">

<script id="hexo-configurations">
    var NexT = window.NexT || {};
    var CONFIG = {"hostname":"yoursite.com","root":"/","scheme":"Mist","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"always","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":false,"show_result":false,"style":null},"back2top":{"enable":true,"sidebar":false,"scrollpercent":false},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":false,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":false,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},"path":"search.xml"};
  </script>

  <meta name="description" content="Java 编码规范 程序员的职业素养编码是一门手艺，我们都是匠人请对代码怀有敬畏之心编码是一种责任请对你自己写的代码负责请在你的作品上署名，并郑重的承诺——为了这段代码我已用尽我的全力请不要编写你自己不懂的代码我们允许你寻求帮助，允许你拷贝但——在你弄懂你写下的代码的实际含义之前，请不要把它合并到你的作品中去我，要做一名有素养的程序员  目录 程序员的职业素养 1. 源文件要求 1.1 文件名 [">
<meta property="og:type" content="website">
<meta property="og:title" content="Akiyama&#39;s Blog">
<meta property="og:url" content="http://yoursite.com/%E5%AE%89%E5%8D%93%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83.html">
<meta property="og:site_name" content="Akiyama&#39;s Blog">
<meta property="og:description" content="Java 编码规范 程序员的职业素养编码是一门手艺，我们都是匠人请对代码怀有敬畏之心编码是一种责任请对你自己写的代码负责请在你的作品上署名，并郑重的承诺——为了这段代码我已用尽我的全力请不要编写你自己不懂的代码我们允许你寻求帮助，允许你拷贝但——在你弄懂你写下的代码的实际含义之前，请不要把它合并到你的作品中去我，要做一名有素养的程序员  目录 程序员的职业素养 1. 源文件要求 1.1 文件名 [">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2021-05-16T09:53:01.014Z">
<meta property="article:modified_time" content="2019-05-01T09:35:55.506Z">
<meta property="article:author" content="丘山月夜">
<meta name="twitter:card" content="summary">

<link rel="canonical" href="http://yoursite.com/%E5%AE%89%E5%8D%93%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome : false,
    isPost : false,
    lang   : 'zh-CN'
  };
</script>

  <title> | Akiyama's Blog
</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <h1 class="site-title">Akiyama's Blog</h1>
      <span class="logo-line-after"><i></i></span>
    </a>
      <p class="site-subtitle" itemprop="description">丘山月夜的博客</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
    </div>
  </div>
</div>




<nav class="site-nav">
  <ul id="menu" class="main-menu menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="home fa fa-home fa-fw"></i>首页</a>

  </li>
        <li class="menu-item menu-item-about">

    <a href="/about/" rel="section"><i class="user fa fa-user fa-fw"></i>关于</a>

  </li>
        <li class="menu-item menu-item-tags">

    <a href="/tags/" rel="section"><i class="tags fa fa-tags fa-fw"></i>标签</a>

  </li>
        <li class="menu-item menu-item-categories">

    <a href="/categories/" rel="section"><i class="th fa fa-th fa-fw"></i>分类</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="archive fa fa-archive fa-fw"></i>归档</a>

  </li>
  </ul>
</nav>




</div>
    </header>

    
  <div class="back-to-top">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          
  
  

          <div class="content page posts-expand">
            

    
    
    
    <div class="post-block" lang="zh-CN">
      <header class="post-header">

<h1 class="post-title" itemprop="name headline">
</h1>

<div class="post-meta">
  

</div>

</header>

      
      
      
      <div class="post-body">
          <h1 id="Java-编码规范"><a href="#Java-编码规范" class="headerlink" title="Java 编码规范"></a>Java 编码规范</h1><p><a id="markdown-程序员的职业素养" name="程序员的职业素养"></a></p>
<h1 id="程序员的职业素养"><a href="#程序员的职业素养" class="headerlink" title="程序员的职业素养"></a>程序员的职业素养</h1><h2 id="编码是一门手艺，我们都是匠人"><a href="#编码是一门手艺，我们都是匠人" class="headerlink" title="编码是一门手艺，我们都是匠人"></a>编码是一门手艺，我们都是匠人</h2><h2 id="请对代码怀有敬畏之心"><a href="#请对代码怀有敬畏之心" class="headerlink" title="请对代码怀有敬畏之心"></a>请对代码怀有敬畏之心</h2><h2 id="编码是一种责任"><a href="#编码是一种责任" class="headerlink" title="编码是一种责任"></a>编码是一种责任</h2><h2 id="请对你自己写的代码负责"><a href="#请对你自己写的代码负责" class="headerlink" title="请对你自己写的代码负责"></a>请对你自己写的代码负责</h2><h2 id="请在你的作品上署名，并郑重的承诺——为了这段代码我已用尽我的全力"><a href="#请在你的作品上署名，并郑重的承诺——为了这段代码我已用尽我的全力" class="headerlink" title="请在你的作品上署名，并郑重的承诺——为了这段代码我已用尽我的全力"></a>请在你的作品上署名，并郑重的承诺——为了这段代码我已用尽我的全力</h2><h2 id="请不要编写你自己不懂的代码"><a href="#请不要编写你自己不懂的代码" class="headerlink" title="请不要编写你自己不懂的代码"></a>请不要编写你自己不懂的代码</h2><h2 id="我们允许你寻求帮助，允许你拷贝"><a href="#我们允许你寻求帮助，允许你拷贝" class="headerlink" title="我们允许你寻求帮助，允许你拷贝"></a>我们允许你寻求帮助，允许你拷贝</h2><h2 id="但——"><a href="#但——" class="headerlink" title="但——"></a>但——</h2><h2 id="在你弄懂你写下的代码的实际含义之前，请不要把它合并到你的作品中去"><a href="#在你弄懂你写下的代码的实际含义之前，请不要把它合并到你的作品中去" class="headerlink" title="在你弄懂你写下的代码的实际含义之前，请不要把它合并到你的作品中去"></a>在你弄懂你写下的代码的实际含义之前，请不要把它合并到你的作品中去</h2><h2 id="我，要做一名有素养的程序员"><a href="#我，要做一名有素养的程序员" class="headerlink" title="我，要做一名有素养的程序员"></a>我，要做一名有素养的程序员</h2><!-- TOC -->

<h1 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h1><ul>
<li><a href="#%E7%A8%8B%E5%BA%8F%E5%91%98%E7%9A%84%E8%81%8C%E4%B8%9A%E7%B4%A0%E5%85%BB">程序员的职业素养</a></li>
<li><a href="#1-%E6%BA%90%E6%96%87%E4%BB%B6%E8%A6%81%E6%B1%82">1. 源文件要求</a><ul>
<li><a href="#11-%E6%96%87%E4%BB%B6%E5%90%8D">1.1 文件名</a><ul>
<li><a href="#%E7%BA%A2-111-%E6%BA%90%E6%96%87%E4%BB%B6%E4%BB%A5%E5%85%B6%E6%9C%80%E9%A1%B6%E5%B1%82%E7%9A%84%E7%B1%BB%E5%90%8D%E6%9D%A5%E5%91%BD%E5%90%8D%E5%A4%A7%E5%B0%8F%E5%86%99%E6%95%8F%E6%84%9F%E6%96%87%E4%BB%B6%E6%89%A9%E5%B1%95%E5%90%8D%E4%B8%BAjava">[红] 1.1.1 源文件以其最顶层的类名来命名，大小写敏感，文件扩展名为<code>.java</code></a></li>
<li><a href="#%E7%BA%A2-112-%E6%BA%90%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81%E6%A0%BC%E5%BC%8F%E4%B8%BAutf-8">[红] 1.1.2 源文件编码格式为<code>UTF-8</code></a></li>
</ul>
</li>
<li><a href="#12-%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6">1.2 特殊字符</a><ul>
<li><a href="#%E9%BB%84-121-%E9%99%A4%E4%BA%86%E8%A1%8C%E7%BB%93%E6%9D%9F%E7%AC%A6%E5%BA%8F%E5%88%97ascii%E6%B0%B4%E5%B9%B3%E7%A9%BA%E6%A0%BC%E5%AD%97%E7%AC%A60x20%E5%8D%B3%E7%A9%BA%E6%A0%BC%E6%98%AF%E6%BA%90%E6%96%87%E4%BB%B6%E4%B8%AD%E5%94%AF%E4%B8%80%E5%85%81%E8%AE%B8%E5%87%BA%E7%8E%B0%E7%9A%84%E7%A9%BA%E7%99%BD%E5%AD%97%E7%AC%A6">[黄] 1.2.1 除了行结束符序列，ASCII水平空格字符(0x20，即空格)是源文件中唯一允许出现的空白字符</a></li>
<li><a href="#%E7%BA%A2-122-%E5%AF%B9%E4%BA%8E%E5%85%B7%E6%9C%89%E7%89%B9%E6%AE%8A%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97%E7%9A%84%E4%BB%BB%E4%BD%95%E5%AD%97%E7%AC%A6%5Cb-%5Ct-%5Cn-%5Cf-%5Cr%E6%88%91%E4%BB%AC%E4%BD%BF%E7%94%A8%E5%AE%83%E7%9A%84%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97%E8%80%8C%E4%B8%8D%E6%98%AF%E7%9B%B8%E5%BA%94%E7%9A%84%E5%85%AB%E8%BF%9B%E5%88%B6%E6%AF%94%E5%A6%82%5C012%E6%88%96unicode%E6%AF%94%E5%A6%82%5Cu000a%E8%BD%AC%E4%B9%89">[红] 1.2.2 对于具有特殊转义序列的任何字符(<code>\b, \t, \n, \f, \r</code>)，我们使用它的转义序列，而不是相应的八进制(比如<code>\012</code>)或Unicode(比如<code>\u000a</code>)转义</a></li>
<li><a href="#%E7%BA%A2-123-%E5%AF%B9%E4%BA%8E%E5%89%A9%E4%BD%99%E7%9A%84%E9%9D%9Eascii%E5%AD%97%E7%AC%A6%E6%98%AF%E4%BD%BF%E7%94%A8%E5%AE%9E%E9%99%85%E7%9A%84unicode%E5%AD%97%E7%AC%A6%E6%AF%94%E5%A6%82%E2%88%9E%E8%BF%98%E6%98%AF%E4%BD%BF%E7%94%A8%E7%AD%89%E4%BB%B7%E7%9A%84unicode%E8%BD%AC%E4%B9%89%E7%AC%A6%E6%AF%94%E5%A6%82%5Cu221e%E5%8F%96%E5%86%B3%E4%BA%8E%E5%93%AA%E4%B8%AA%E8%83%BD%E8%AE%A9%E4%BB%A3%E7%A0%81%E6%9B%B4%E6%98%93%E4%BA%8E%E9%98%85%E8%AF%BB%E5%92%8C%E7%90%86%E8%A7%A3">[红] 1.2.3 对于剩余的非ASCII字符，是使用实际的Unicode字符(比如<code>∞</code>)，还是使用等价的Unicode转义符(比如<code>\u221e</code>)，取决于哪个能让代码更易于阅读和理解</a></li>
</ul>
</li>
<li><a href="#13-%E6%BA%90%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84">1.3 源文件结构</a><ul>
<li><a href="#%E9%BB%84-131-%E4%B8%80%E4%B8%AA%E6%BA%90%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%8C%89%E9%A1%BA%E5%BA%8F%E5%9C%B0">[黄] 1.3.1 一个源文件包含(按顺序地)：</a></li>
<li><a href="#%E9%BB%84-132-%E5%A6%82%E6%9E%9C%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E8%AE%B8%E5%8F%AF%E8%AF%81%E6%88%96%E7%89%88%E6%9D%83%E4%BF%A1%E6%81%AF%E9%82%A3%E4%B9%88%E5%AE%83%E5%BA%94%E5%BD%93%E8%A2%AB%E6%94%BE%E5%9C%A8%E6%96%87%E4%BB%B6%E6%9C%80%E5%89%8D%E9%9D%A2">[黄] 1.3.2 如果一个文件包含许可证或版权信息，那么它应当被放在文件最前面。</a></li>
<li><a href="#%E7%BA%A2-133-package%E8%AF%AD%E5%8F%A5%E4%B8%8D%E6%8D%A2%E8%A1%8C%E5%88%97%E9%99%90%E5%88%B6%E5%B9%B6%E4%B8%8D%E9%80%82%E7%94%A8%E4%BA%8Epackage%E8%AF%AD%E5%8F%A5%E5%8D%B3package%E8%AF%AD%E5%8F%A5%E5%86%99%E5%9C%A8%E4%B8%80%E8%A1%8C%E9%87%8C">[红] 1.3.3 package语句不换行，列限制并不适用于package语句。(即package语句写在一行里)</a></li>
<li><a href="#134-import%E8%AF%AD%E5%8F%A5%E8%A6%81%E6%B1%82">1.3.4 import语句要求</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#2-%E6%A0%BC%E5%BC%8F">2. 格式</a><ul>
<li><a href="#21-%E5%A4%A7%E6%8B%AC%E5%8F%B7">2.1 大括号</a><ul>
<li><a href="#%E7%BA%A2-211-%E5%A4%A7%E6%8B%AC%E5%8F%B7%E4%B8%8Eif-else-for-do-while%E8%AF%AD%E5%8F%A5%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8%E5%8D%B3%E4%BD%BF%E5%8F%AA%E6%9C%89%E4%B8%80%E6%9D%A1%E8%AF%AD%E5%8F%A5%E6%88%96%E6%98%AF%E7%A9%BA%E4%B9%9F%E5%BA%94%E8%AF%A5%E6%8A%8A%E5%A4%A7%E6%8B%AC%E5%8F%B7%E5%86%99%E4%B8%8A">[红] 2.1.1 大括号与<code>if, else, for, do, while</code>语句一起使用，即使只有一条语句(或是空)，也应该把大括号写上</a></li>
<li><a href="#%E7%BA%A2-212-%E5%AF%B9%E4%BA%8E%E9%9D%9E%E7%A9%BA%E5%9D%97%E5%92%8C%E5%9D%97%E7%8A%B6%E7%BB%93%E6%9E%84%E5%A4%A7%E6%8B%AC%E5%8F%B7%E9%81%B5%E5%BE%AAkernighan%E5%92%8Critchie%E9%A3%8E%E6%A0%BC-egyptian-brackets">[红] 2.1.2 对于非空块和块状结构，大括号遵循Kernighan和Ritchie风格 (Egyptian brackets)</a></li>
<li><a href="#%E7%BA%A2-213-%E5%A6%82%E6%9E%9C%E5%AE%83%E6%98%AF%E4%B8%80%E4%B8%AA%E5%A4%9A%E5%9D%97%E8%AF%AD%E5%8F%A5%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86ifelse%E6%88%96trycatchfinally%E5%8D%B3%E4%BD%BF%E5%A4%A7%E6%8B%AC%E5%8F%B7%E5%86%85%E6%B2%A1%E5%86%85%E5%AE%B9%E5%8F%B3%E5%A4%A7%E6%8B%AC%E5%8F%B7%E4%B9%9F%E8%A6%81%E6%8D%A2%E8%A1%8C">[红] 2.1.3 如果它是一个多块语句的一部分(<code>if/else</code>或<code>try/catch/finally</code>)，即使大括号内没内容，右大括号也要换行</a></li>
</ul>
</li>
<li><a href="#22-%E7%A9%BA%E7%99%BD">2.2 空白</a><ul>
<li><a href="#%E7%BA%A2-221-%E7%A9%BA%E8%A1%8C%E7%9A%84%E4%BD%BF%E7%94%A8">[红] 2.2.1 空行的使用</a></li>
<li><a href="#%E7%BA%A2-222-%E4%B8%8D%E5%85%81%E8%AE%B8%E5%A4%9A%E4%B8%AA%E8%BF%9E%E7%BB%AD%E7%9A%84%E7%A9%BA%E8%A1%8C">[红] 2.2.2 不允许多个连续的空行</a></li>
<li><a href="#%E7%BA%A2-223-%E7%A9%BA%E6%A0%BC%E7%9A%84%E4%BD%BF%E7%94%A8">[红] 2.2.3 空格的使用</a></li>
<li><a href="#%E9%BB%84-224-%E4%B8%8D%E8%A6%81%E5%81%9A%E6%B0%B4%E5%B9%B3%E5%AF%B9%E9%BD%90">[黄] 2.2.4 不要做水平对齐</a></li>
<li><a href="#%E7%BA%A2-225-%E4%B8%8D%E5%85%81%E8%AE%B8%E6%9C%89%E8%B6%85%E8%BF%873%E5%B1%82%E7%9A%84if%E5%B5%8C%E5%A5%97">[红] 2.2.5 不允许有超过3层的if嵌套</a></li>
<li><a href="#%E7%BA%A2-226-%E4%BB%BB%E4%BD%95%E8%BF%90%E7%AE%97%E7%AC%A6%E5%B7%A6%E5%8F%B3%E5%BF%85%E9%A1%BB%E5%8A%A0%E4%B8%80%E4%B8%AA%E7%A9%BA%E6%A0%BC">[红] 2.2.6 任何运算符左右必须加一个空格</a></li>
<li><a href="#%E9%BB%84-227-%E7%94%A8%E5%B0%8F%E6%8B%AC%E5%8F%B7%E6%9D%A5%E9%99%90%E5%AE%9A%E7%BB%84">[黄] 2.2.7 用小括号来限定组</a></li>
<li><a href="#%E7%BA%A2-228-%E5%B7%A6%E6%8B%AC%E5%8F%B7%E5%92%8C%E5%90%8E%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B9%8B%E9%97%B4%E4%B8%8D%E5%87%BA%E7%8E%B0%E7%A9%BA%E6%A0%BC%E5%90%8C%E6%A0%B7%E5%8F%B3%E6%8B%AC%E5%8F%B7%E5%92%8C%E5%89%8D%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B9%8B%E9%97%B4%E4%B9%9F%E4%B8%8D%E5%87%BA%E7%8E%B0%E7%A9%BA%E6%A0%BC">[红] 2.2.8 左括号和后一个字符之间不出现空格；同样，右括号和前一个字符之间也不出现空格</a></li>
<li><a href="#%E7%BA%A2-229-ifforwhileswitchdo%E7%AD%89%E4%BF%9D%E7%95%99%E5%AD%97%E4%B8%8E%E5%B7%A6%E5%8F%B3%E6%8B%AC%E5%8F%B7%E4%B9%8B%E9%97%B4%E9%83%BD%E5%BF%85%E9%A1%BB%E5%8A%A0%E7%A9%BA%E6%A0%BC">[红] 2.2.9 <code>if/for/while/switch/do</code>等保留字与左右括号之间都必须加空格</a></li>
</ul>
</li>
<li><a href="#23-%E6%9E%9A%E4%B8%BE">2.3 枚举</a><ul>
<li><a href="#%E7%BA%A2-231-%E6%9E%9A%E4%B8%BE%E5%B8%B8%E9%87%8F%E9%97%B4%E7%94%A8%E9%80%97%E5%8F%B7%E9%9A%94%E5%BC%80%E6%8D%A2%E8%A1%8C%E5%8F%AF%E9%80%89%E6%B2%A1%E6%9C%89%E6%96%B9%E6%B3%95%E5%92%8C%E6%96%87%E6%A1%A3%E7%9A%84%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%8F%AF%E5%86%99%E6%88%90%E6%95%B0%E7%BB%84%E5%88%9D%E5%A7%8B%E5%8C%96%E7%9A%84%E6%A0%BC%E5%BC%8F">[红] 2.3.1 枚举常量间用逗号隔开，换行可选，没有方法和文档的枚举类可写成数组初始化的格式</a></li>
</ul>
</li>
<li><a href="#24-%E5%8F%98%E9%87%8F">2.4 变量</a><ul>
<li><a href="#%E7%BA%A2-241-%E6%AF%8F%E6%AC%A1%E5%8F%AA%E5%A3%B0%E6%98%8E%E4%B8%80%E4%B8%AA%E5%8F%98%E9%87%8F">[红] 2.4.1 每次只声明一个变量</a></li>
<li><a href="#%E7%BA%A2-242-%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F%E9%9C%80%E8%A6%81%E6%97%B6%E6%89%8D%E5%A3%B0%E6%98%8E%E5%A3%B0%E6%98%8E%E7%9A%84%E5%90%8C%E6%97%B6%E8%A6%81%E8%BF%9B%E8%A1%8C%E5%88%9D%E5%A7%8B%E5%8C%96">[红] 2.4.2 局部变量需要时才声明，声明的同时要进行初始化</a></li>
</ul>
</li>
<li><a href="#25-%E6%95%B0%E7%BB%84">2.5 数组</a><ul>
<li><a href="#%E9%BB%84-251-%E6%95%B0%E7%BB%84%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%AF%E5%86%99%E6%88%90%E5%9D%97%E7%8A%B6%E7%BB%93%E6%9E%84">[黄] 2.5.1 数组初始化：可写成块状结构</a></li>
<li><a href="#%E7%BA%A2-252-%E9%9D%9Ec%E9%A3%8E%E6%A0%BC%E7%9A%84%E6%95%B0%E7%BB%84%E5%A3%B0%E6%98%8E">[红] 2.5.2 非C风格的数组声明</a></li>
</ul>
</li>
<li><a href="#26-switch%E8%AF%AD%E5%8F%A5">2.6 switch语句</a><ul>
<li><a href="#%E7%BA%A2-261-%E7%BC%A9%E8%BF%9B">[红] 2.6.1 缩进</a></li>
<li><a href="#%E7%BA%A2-262-fall-through%E6%B3%A8%E9%87%8A">[红] 2.6.2 <code>Fall-through</code>：注释</a></li>
<li><a href="#%E7%BA%A2-263-default%E7%9A%84%E6%83%85%E5%86%B5%E8%A6%81%E5%86%99%E5%87%BA%E6%9D%A5">[红] 2.6.3 <code>default</code>的情况要写出来</a></li>
</ul>
</li>
<li><a href="#27-%E6%B3%A8%E8%A7%A3annotations">2.7 注解(Annotations)</a><ul>
<li><a href="#%E7%BA%A2-271-%E6%B3%A8%E8%A7%A3%E7%B4%A7%E8%B7%9F%E5%9C%A8%E6%96%87%E6%A1%A3%E5%9D%97%E5%90%8E%E9%9D%A2%E5%BA%94%E7%94%A8%E4%BA%8E%E7%B1%BB%E6%96%B9%E6%B3%95%E5%92%8C%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E4%B8%80%E4%B8%AA%E6%B3%A8%E8%A7%A3%E7%8B%AC%E5%8D%A0%E4%B8%80%E8%A1%8C%E8%BF%99%E4%BA%9B%E6%8D%A2%E8%A1%8C%E4%B8%8D%E5%B1%9E%E4%BA%8E%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C%E5%9B%A0%E6%AD%A4%E7%BC%A9%E8%BF%9B%E7%BA%A7%E5%88%AB%E4%B8%8D%E5%8F%98">[红] 2.7.1 注解紧跟在文档块后面，应用于类、方法和构造函数，一个注解独占一行。这些换行不属于自动换行，因此缩进级别不变</a></li>
</ul>
</li>
<li><a href="#28-%E6%B3%A8%E9%87%8A">2.8 注释</a><ul>
<li><a href="#%E7%BA%A2-281-%E5%9D%97%E6%B3%A8%E9%87%8A%E9%A3%8E%E6%A0%BC">[红] 2.8.1 块注释风格</a></li>
<li><a href="#%E9%BB%84-282-%E4%BF%AE%E5%A4%8Dbug%E9%9C%80%E8%A6%81%E5%A2%9E%E5%8A%A0%E6%B3%A8%E9%87%8A%E8%A7%A3%E5%86%B3%E4%BA%86%E4%BB%80%E4%B9%88bugbug%E5%8E%9F%E5%9B%A0%E9%80%9A%E8%BF%87%E4%BD%95%E7%A7%8D%E6%96%B9%E5%BC%8F">[黄] 2.8.2 修复bug需要增加注释，解决了什么bug，bug原因，通过何种方式</a></li>
<li><a href="#%E7%BA%A2-283-%E4%B8%8D%E5%8F%AF%E4%BB%A5%E5%87%BA%E7%8E%B0%E6%B3%A8%E9%87%8A%E4%BB%85%E4%BB%85%E6%98%AF%E4%B8%BA%E4%BA%86%E4%BB%A3%E7%A0%81%E4%B8%8D%E8%BF%90%E8%A1%8C%E5%A6%82%E6%9E%9C%E6%98%AF%E5%9B%A0%E4%B8%BA%E4%BB%A5%E5%90%8E%E5%8F%AF%E8%83%BD%E4%BC%9A%E7%94%A8%E5%88%B0%E8%80%8C%E4%BF%9D%E7%95%99%E4%B8%80%E5%AE%9A%E7%94%A8%E6%B3%A8%E9%87%8A%E8%AF%B4%E6%98%8E%E5%90%A6%E5%88%99%E8%AF%B7%E4%B8%80%E5%AE%9A%E4%B8%80%E5%BE%8B%E5%88%A0%E6%8E%89">[红] 2.8.3 不可以出现注释仅仅是为了代码不运行，如果是因为以后可能会用到而保留，一定用注释说明，否则请一定一律删掉</a></li>
</ul>
</li>
<li><a href="#29-%E5%85%B6%E4%BB%96">2.9 其他</a><ul>
<li><a href="#%E7%BA%A2-291-%E5%9D%97%E7%BC%A9%E8%BF%9B4%E4%B8%AA%E7%A9%BA%E6%A0%BC%E6%AF%8F%E5%BD%93%E5%BC%80%E5%A7%8B%E4%B8%80%E4%B8%AA%E6%96%B0%E7%9A%84%E5%9D%97%E7%BC%A9%E8%BF%9B%E5%A2%9E%E5%8A%A04%E4%B8%AA%E7%A9%BA%E6%A0%BC%E5%BD%93%E5%9D%97%E7%BB%93%E6%9D%9F%E6%97%B6%E7%BC%A9%E8%BF%9B%E8%BF%94%E5%9B%9E%E5%85%88%E5%89%8D%E7%9A%84%E7%BC%A9%E8%BF%9B%E7%BA%A7%E5%88%AB%E7%BC%A9%E8%BF%9B%E7%BA%A7%E5%88%AB%E9%80%82%E7%94%A8%E4%BA%8E%E4%BB%A3%E7%A0%81%E5%92%8C%E6%B3%A8%E9%87%8A">[红] 2.9.1 块缩进：4个空格，每当开始一个新的块，缩进增加4个空格，当块结束时，缩进返回先前的缩进级别。缩进级别适用于代码和注释</a></li>
<li><a href="#%E7%BA%A2-292-%E4%B8%80%E8%A1%8C%E4%B8%80%E4%B8%AA%E8%AF%AD%E5%8F%A5%E6%AF%8F%E4%B8%AA%E8%AF%AD%E5%8F%A5%E5%90%8E%E8%A6%81%E6%8D%A2%E8%A1%8C">[红] 2.9.2 一行一个语句，每个语句后要换行</a></li>
<li><a href="#%E7%BA%A2-293-%E5%88%97%E9%99%90%E5%88%B680%E6%88%96100">[红] 2.9.3 列限制：80或100</a></li>
<li><a href="#%E7%BA%A2-294-%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C">[红] 2.9.4 自动换行</a></li>
<li><a href="#%E7%BA%A2-295-%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%87%86%E5%88%99%E6%98%AF%E6%9B%B4%E5%80%BE%E5%90%91%E4%BA%8E%E5%9C%A8%E6%9B%B4%E9%AB%98%E7%9A%84%E8%AF%AD%E6%B3%95%E7%BA%A7%E5%88%AB%E5%A4%84%E6%96%AD%E5%BC%80">[红] 2.9.5 自动换行的基本准则是：更倾向于在更高的语法级别处断开</a></li>
<li><a href="#%E7%BA%A2-296-%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C%E6%97%B6%E7%BC%A9%E8%BF%9B4%E4%B8%AA%E7%A9%BA%E6%A0%BC">[红] 2.9.6 自动换行时缩进<code>4</code>个空格</a></li>
<li><a href="#%E7%BA%A2-297-modifiers">[红] 2.9.7 Modifiers</a></li>
<li><a href="#%E7%BA%A2-298-%E4%B8%8D%E8%A6%81%E5%9C%A8switch%E4%B8%AD%E5%B5%8C%E5%A5%97switch">[红] 2.9.8 不要在switch中嵌套switch</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#3-%E5%91%BD%E5%90%8D%E7%BA%A6%E5%AE%9A">3. 命名约定</a><ul>
<li><a href="#31-android">3.1 Android</a><ul>
<li><a href="#%E7%BA%A2-311-%E6%8E%A7%E4%BB%B6%E4%BB%A5%E5%8A%9F%E8%83%BD%E6%8E%A7%E4%BB%B6%E5%91%BD%E5%90%8D">[红] 3.1.1 控件以功能+控件命名</a></li>
<li><a href="#%E7%BA%A2-312-%E5%B8%83%E5%B1%80%E6%96%87%E4%BB%B6%E5%91%BD%E5%90%8D">[红] 3.1.2 布局文件命名</a></li>
<li><a href="#%E7%BA%A2-313-%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6%E5%91%BD%E5%90%8D">[红] 3.1.3 资源文件命名</a></li>
<li><a href="#%E7%BA%A2-314-%E6%8E%A5%E5%8F%A3%E5%91%BD%E5%90%8D">[红] 3.1.4 接口命名</a></li>
</ul>
</li>
<li><a href="#32-java">3.2 Java</a><ul>
<li><a href="#%E7%BA%A2-321-%E5%8C%85%E5%90%8D%E5%85%A8%E9%83%A8%E5%B0%8F%E5%86%99%E8%BF%9E%E7%BB%AD%E7%9A%84%E5%8D%95%E8%AF%8D%E5%8F%AA%E6%98%AF%E7%AE%80%E5%8D%95%E5%9C%B0%E8%BF%9E%E6%8E%A5%E8%B5%B7%E6%9D%A5%E4%B8%8D%E4%BD%BF%E7%94%A8%E4%B8%8B%E5%88%92%E7%BA%BF">[红] 3.2.1 包名全部小写，连续的单词只是简单地连接起来，不使用下划线</a></li>
<li><a href="#%E7%BA%A2-322-%E7%B1%BB%E5%90%8D%E9%83%BD%E4%BB%A5uppercamelcase%E9%A3%8E%E6%A0%BC%E7%BC%96%E5%86%99">[红] 3.2.2 类名都以<code>UpperCamelCase</code>风格编写</a></li>
<li><a href="#%E7%BA%A2-323-%E6%96%B9%E6%B3%95%E5%90%8D%E9%83%BD%E4%BB%A5lowercamelcase%E9%A3%8E%E6%A0%BC%E7%BC%96%E5%86%99">[红] 3.2.3 方法名都以<code>lowerCamelCase</code>风格编写</a></li>
<li><a href="#%E9%BB%84-324-%E6%96%B9%E6%B3%95%E5%91%BD%E5%90%8D%E7%BA%A6%E5%AE%9A">[黄] 3.2.4 方法命名约定：</a></li>
<li><a href="#%E7%BA%A2-325-%E5%B8%B8%E9%87%8F%E5%90%8D%E5%91%BD%E5%90%8D%E6%A8%A1%E5%BC%8F%E4%B8%BAconstant_case%E5%85%A8%E9%83%A8%E5%AD%97%E6%AF%8D%E5%A4%A7%E5%86%99%E7%94%A8%E4%B8%8B%E5%88%92%E7%BA%BF%E5%88%86%E9%9A%94%E5%8D%95%E8%AF%8D">[红] 3.2.5 常量名命名模式为<code>CONSTANT_CASE</code>，全部字母大写，用下划线分隔单词</a></li>
<li><a href="#%E7%BA%A2-326-%E9%9D%9E%E5%B8%B8%E9%87%8F%E5%AD%97%E6%AE%B5%E5%90%8D%E4%BB%A5lowercamelcase%E9%A3%8E%E6%A0%BC%E7%BC%96%E5%86%99">[红] 3.2.6 非常量字段名以<code>lowerCamelCase</code>风格编写</a></li>
<li><a href="#%E7%BA%A2-327-%E5%8F%82%E6%95%B0%E5%90%8D%E4%BB%A5lowercamelcase%E9%A3%8E%E6%A0%BC%E7%BC%96%E5%86%99">[红] 3.2.7 参数名以<code>lowerCamelCase</code>风格编写</a></li>
<li><a href="#%E7%BA%A2-328-%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F%E5%90%8D%E4%BB%A5lowercamelcase%E9%A3%8E%E6%A0%BC%E7%BC%96%E5%86%99">[红] 3.2.8 局部变量名以<code>lowerCamelCase</code>风格编写</a></li>
<li><a href="#%E7%BA%A2-329-%E7%B1%BB%E5%9E%8B%E5%8F%98%E9%87%8F%E5%90%8D">[红] 3.2.9 类型变量名</a></li>
<li><a href="#%E7%BA%A2-3210-%E6%89%80%E6%9C%89%E6%A0%87%E8%AF%86%E7%AC%A6%E5%91%BD%E5%90%8D%E5%BF%85%E9%A1%BB%E8%8B%B1%E6%96%87%E4%B8%8D%E5%8F%AF%E4%BB%A5%E6%9C%89%E6%8B%BC%E9%9F%B3">[红] 3.2.10 所有标识符命名必须英文，不可以有拼音</a></li>
<li><a href="#%E7%BA%A2-3211-%E4%B8%8D%E5%8F%AF%E4%BB%A5%E6%9C%89%E6%97%A0%E5%BF%85%E8%A6%81%E7%9A%84%E7%BC%A9%E5%86%99absclassimg%E7%AD%89%E4%B8%8D%E5%85%81%E8%AE%B8%E5%87%BA%E7%8E%B0">[红] 3.2.11 不可以有无必要的缩写AbsClass,Img等不允许出现</a></li>
<li><a href="#%E7%BA%A2-3212-%E6%8A%BD%E8%B1%A1%E7%B1%BB%E5%91%BD%E5%90%8D%E4%BD%BF%E7%94%A8abstract%E6%88%96base%E5%BC%80%E5%A4%B4%E5%BC%82%E5%B8%B8%E7%B1%BB%E5%91%BD%E5%90%8D%E4%BD%BF%E7%94%A8exception%E7%BB%93%E5%B0%BE%E6%B5%8B%E8%AF%95%E7%B1%BB%E5%91%BD%E5%90%8D%E4%BB%A5%E5%AE%83%E8%A6%81%E6%B5%8B%E8%AF%95%E7%9A%84%E7%B1%BB%E7%9A%84%E5%90%8D%E7%A7%B0%E5%BC%80%E5%A7%8B%E4%BB%A5test%E7%BB%93%E5%B0%BE">[红] 3.2.12 抽象类命名使用Abstract或Base开头；异常类命名使用Exception结尾；测试类命名以它要测试的类的名称开始，以Test结尾</a></li>
<li><a href="#%E7%BA%A2-3213-%E5%A6%82%E6%9E%9C%E4%BD%BF%E7%94%A8%E4%BA%86%E6%9F%90%E7%A7%8D%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E8%AF%B7%E5%8A%A1%E5%BF%85%E5%9C%A8%E7%B1%BB%E5%90%8D%E4%B8%AD%E4%BD%93%E7%8E%B0">[红] 3.2.13 如果使用了某种设计模式，请务必在类名中体现</a></li>
<li><a href="#%E7%BA%A2-3214-%E6%8E%A5%E5%8F%A3%E7%B1%BB%E7%9A%84%E6%96%B9%E6%B3%95%E8%A6%81%E5%8A%A0%E6%B3%A8%E9%87%8A%E8%AF%B4%E6%98%8E%E5%B9%B6%E4%B8%94%E4%B8%8D%E9%9C%80%E8%A6%81%E4%BB%BB%E4%BD%95%E4%BF%AE%E9%A5%B0%E8%AF%8D%E5%A6%82public">[红] 3.2.14 接口类的方法要加注释说明，并且不需要任何修饰词(如public)</a></li>
<li><a href="#%E9%BB%84-3215-enum-%E5%91%BD%E5%90%8D%E4%BB%A5enum%E5%BC%80%E5%A4%B4%E4%B8%94%E6%88%90%E5%91%98%E5%BF%85%E9%A1%BB%E5%85%A8%E5%A4%A7%E5%86%99">[黄] 3.2.15 Enum 命名以Enum开头，且成员必须全大写</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#4-%E7%BC%96%E7%A8%8B%E5%AE%9E%E8%B7%B5">4. 编程实践</a><ul>
<li><a href="#41-android">4.1 Android</a><ul>
<li><a href="#%E7%BA%A2-411-%E5%A6%82%E6%9E%9C%E8%83%BD%E9%80%9A%E8%BF%87xml%E6%8F%8F%E8%BF%B0%E8%A7%A3%E5%86%B3%E7%9A%84drawable%E4%B8%8D%E7%94%A8%E4%BD%BF%E7%94%A8ui%E5%88%87%E5%9B%BE%E4%B8%8D%E8%AE%BA%E6%98%AF%E6%95%88%E7%8E%87%E8%BF%98%E6%98%AF%E6%89%A9%E5%B1%95%E6%80%A7xml%E6%8F%8F%E8%BF%B0%E7%9A%84drawable%E8%BF%9C%E6%AF%94%E7%94%A8%E5%88%87%E5%9B%BE%E5%A5%BD%E5%BE%88%E5%A4%9A">[红] 4.1.1 如果能通过xml描述解决的drawable，不用使用UI切图，不论是效率还是扩展性，xml描述的drawable远比用切图好很多</a></li>
<li><a href="#%E7%BA%A2-412-%E4%BD%BF%E7%94%A8adapterview%E7%9A%84%E5%AD%90%E7%B1%BB%E5%92%8Cadapter%E6%97%B6%E5%AE%9E%E7%8E%B0getview%E6%97%B6%E8%A6%81%E6%98%AF%E7%94%A8convertview%E8%80%8C%E4%B8%8D%E6%98%AF%E6%AF%8F%E6%AC%A1%E9%83%BD%E9%87%8D%E6%96%B0%E6%9E%84%E5%BB%BAview">[红] 4.1.2 使用AdapterView的子类和Adapter时，实现getView时，要是用convertView，而不是每次都重新构建View</a></li>
<li><a href="#%E9%BB%84-413-%E8%AE%BE%E8%AE%A1ui%E6%97%B6%E8%A6%81%E6%B3%A8%E6%84%8F%E9%81%BF%E5%85%8D%E8%BF%87%E5%BA%A6%E7%BB%98%E5%88%B6%E4%B8%8D%E8%83%BD%E5%87%BA%E7%8E%B0%E5%90%8C%E4%B8%80%E4%B8%AA%E5%8C%BA%E5%9F%9F2%E5%80%8D%E4%BB%A5%E4%B8%8A%E7%9A%84%E8%BF%87%E5%BA%A6%E7%BB%98%E5%88%B6">[黄] 4.1.3 设计UI时要注意避免过度绘制，不能出现同一个区域2倍以上的过度绘制</a></li>
<li><a href="#%E7%BA%A2-414-%E6%97%A5%E5%BF%97%E8%A7%84%E8%8C%83">[红] 4.1.4 日志规范</a></li>
<li><a href="#%E7%BA%A2-415-%E5%B1%9E%E6%80%A7%E4%BD%BF%E7%94%A8%E8%A7%84%E8%8C%83">[红] 4.1.5 属性使用规范</a></li>
<li><a href="#%E9%BB%84-416-%E9%9C%80%E8%A6%81%E4%BD%BF%E7%94%A8%E5%88%97%E8%A1%A8%E6%A0%B7%E5%BC%8F%E7%9A%84ui%E6%97%B6%E4%BC%98%E5%85%88%E4%BD%BF%E7%94%A8recyclerview%E8%80%8C%E4%B8%8D%E6%98%AFlistview">[黄] 4.1.6 需要使用列表样式的UI时优先使用RecyclerView，而不是ListView</a></li>
</ul>
</li>
<li><a href="#42-%E9%9B%86%E5%90%88">4.2 集合</a><ul>
<li><a href="#%E9%BB%84-421-mapset%E7%9A%84key%E4%B8%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%B9%E8%B1%A1%E6%97%B6%E5%BF%85%E9%A1%BB%E9%87%8D%E5%86%99hashcode%E5%92%8Cequals">[黄] 4.2.1 Map/Set的key为自定义对象时，必须重写hashCode和equals</a></li>
<li><a href="#%E9%BB%84-422-arraylist%E7%9A%84sublist%E7%BB%93%E6%9E%9C%E4%B8%8D%E5%8F%AF%E5%BC%BA%E8%BD%AC%E6%88%90arraylist%E5%90%A6%E5%88%99%E4%BC%9A%E6%8A%9B%E5%87%BAclasscastexception%E5%BC%82%E5%B8%B8">[黄] 4.2.2 ArrayList的subList结果不可强转成ArrayList，否则会抛出ClassCastException异常</a></li>
<li><a href="#%E9%BB%84-423-%E5%9C%A8sublist%E5%9C%BA%E6%99%AF%E4%B8%AD%E9%AB%98%E5%BA%A6%E6%B3%A8%E6%84%8F%E5%AF%B9%E5%8E%9F%E9%9B%86%E5%90%88%E5%85%83%E7%B4%A0%E4%B8%AA%E6%95%B0%E7%9A%84%E4%BF%AE%E6%94%B9%E4%BC%9A%E5%AF%BC%E8%87%B4%E5%AD%90%E5%88%97%E8%A1%A8%E7%9A%84%E9%81%8D%E5%8E%86%E5%A2%9E%E5%8A%A0%E5%88%A0%E9%99%A4%E5%9D%87%E4%BA%A7%E7%94%9Fconcurrentmodificationexception%E5%BC%82%E5%B8%B8">[黄] 4.2.3 在subList场景中，高度注意对原集合元素个数的修改，会导致子列表的遍历、增加、删除均产生ConcurrentModificationException异常</a></li>
<li><a href="#%E9%BB%84-424-%E4%BD%BF%E7%94%A8%E9%9B%86%E5%90%88%E8%BD%AC%E6%95%B0%E7%BB%84%E7%9A%84%E6%96%B9%E6%B3%95%E5%BF%85%E9%A1%BB%E4%BD%BF%E7%94%A8%E9%9B%86%E5%90%88%E7%9A%84toarrayt-array%E4%BC%A0%E5%85%A5%E7%9A%84%E6%98%AF%E7%B1%BB%E5%9E%8B%E5%AE%8C%E5%85%A8%E4%B8%80%E6%A0%B7%E7%9A%84%E6%95%B0%E7%BB%84%E5%A4%A7%E5%B0%8F%E5%B0%B1%E6%98%AFlistsize">[黄] 4.2.4 使用集合转数组的方法，必须使用集合的toArray(T[] array)，传入的是类型完全一样的数组，大小就是list.size()</a></li>
<li><a href="#%E9%BB%84-425-%E4%BD%BF%E7%94%A8%E5%B7%A5%E5%85%B7%E7%B1%BBarraysaslist%E6%8A%8A%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E6%88%90%E9%9B%86%E5%90%88%E6%97%B6%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8%E5%85%B6%E4%BF%AE%E6%94%B9%E9%9B%86%E5%90%88%E7%9B%B8%E5%85%B3%E7%9A%84%E6%96%B9%E6%B3%95%E5%AE%83%E7%9A%84addremoveclear%E6%96%B9%E6%B3%95%E4%BC%9A%E6%8A%9B%E5%87%BAunsupportedoperationexception%E5%BC%82%E5%B8%B8">[黄] 4.2.5 使用工具类Arrays.asList()把数组转换成集合时，不能使用其修改集合相关的方法，它的add/remove/clear方法会抛出UnsupportedOperationException异常</a></li>
<li><a href="#%E9%BB%84-426-%E4%B8%8D%E8%A6%81%E5%9C%A8foreach%E5%BE%AA%E7%8E%AF%E9%87%8C%E8%BF%9B%E8%A1%8C%E5%85%83%E7%B4%A0%E7%9A%84removeadd%E6%93%8D%E4%BD%9Cremove%E5%85%83%E7%B4%A0%E8%AF%B7%E4%BD%BF%E7%94%A8iterator-%E6%96%B9%E5%BC%8F%E5%A6%82%E6%9E%9C%E5%B9%B6%E5%8F%91%E6%93%8D%E4%BD%9C%E9%9C%80%E8%A6%81%E5%AF%B9iterator%E5%AF%B9%E8%B1%A1%E5%8A%A0%E9%94%81">[黄] 4.2.6 不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator 方式，如果并发操作，需要对Iterator对象加锁</a></li>
<li>=====<a href="#%E9%BB%84-427-%E4%BD%BF%E7%94%A8entryset%E9%81%8D%E5%8E%86map%E7%B1%BB%E9%9B%86%E5%90%88kv%E8%80%8C%E4%B8%8D%E6%98%AFkeyset%E6%96%B9%E5%BC%8F%E8%BF%9B%E8%A1%8C%E9%81%8D%E5%8E%86">[黄] 4.2.7 使用entrySet遍历Map类集合KV，而不是keySet方式进行遍历</a></li>
</ul>
</li>
<li><a href="#43-%E5%B9%B6%E5%8F%91">4.3 并发</a><ul>
<li><a href="#%E7%BA%A2-431-%E7%BA%BF%E7%A8%8B%E8%B5%84%E6%BA%90%E5%BF%85%E9%A1%BB%E9%80%9A%E8%BF%87%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%8F%90%E4%BE%9B%E4%B8%8D%E5%85%81%E8%AE%B8%E5%9C%A8%E5%BA%94%E7%94%A8%E4%B8%AD%E8%87%AA%E8%A1%8C%E6%98%BE%E5%BC%8F%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E5%8F%82%E8%80%83%E4%BB%A3%E7%A0%81">[红] 4.3.1 线程资源必须通过线程池提供，不允许在应用中自行显式创建线程，参考代码：</a></li>
<li>=====<a href="#%E7%BA%A2-432-simpledateformat-%E6%98%AF%E7%BA%BF%E7%A8%8B%E4%B8%8D%E5%AE%89%E5%85%A8%E7%9A%84%E7%B1%BB%E4%B8%80%E8%88%AC%E4%B8%8D%E8%A6%81%E5%AE%9A%E4%B9%89%E4%B8%BAstatic%E5%8F%98%E9%87%8F%E5%A6%82%E6%9E%9C%E5%AE%9A%E4%B9%89%E4%B8%BA-static%E5%BF%85%E9%A1%BB%E5%8A%A0%E9%94%81%E6%88%96%E8%80%85%E4%BD%BF%E7%94%A8dateutils%E5%B7%A5%E5%85%B7%E7%B1%BB">[红] 4.3.2 SimpleDateFormat 是线程不安全的类，一般不要定义为static变量，如果定义为 static，必须加锁，或者使用DateUtils工具类</a></li>
<li><a href="#%E7%BA%A2-433-%E5%90%8C%E6%AD%A5%E8%B0%83%E7%94%A8%E5%BA%94%E8%AF%A5%E5%8E%BB%E8%80%83%E9%87%8F%E9%94%81%E7%9A%84%E6%80%A7%E8%83%BD%E6%8D%9F%E8%80%97%E8%83%BD%E7%94%A8%E6%97%A0%E9%94%81%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%B0%B1%E4%B8%8D%E8%A6%81%E7%94%A8%E9%94%81%E8%83%BD%E9%94%81%E5%8C%BA%E5%9D%97%E5%B0%B1%E4%B8%8D%E8%A6%81%E9%94%81%E6%95%B4%E4%B8%AA%E6%96%B9%E6%B3%95%E4%BD%93%E8%83%BD%E7%94%A8%E5%AF%B9%E8%B1%A1%E9%94%81%E5%B0%B1%E4%B8%8D%E8%A6%81%E7%94%A8%E7%B1%BB%E9%94%81">[红] 4.3.3 同步调用应该去考量锁的性能损耗。能用无锁数据结构，就不要用锁；能锁区块，就不要锁整个方法体；能用对象锁，就不要用类锁</a></li>
<li><a href="#%E7%BA%A2-434-%E5%AF%B9%E5%A4%9A%E4%B8%AA%E8%B5%84%E6%BA%90%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E5%AF%B9%E8%B1%A1%E5%90%8C%E6%97%B6%E5%8A%A0%E9%94%81%E6%97%B6%E9%9C%80%E8%A6%81%E4%BF%9D%E6%8C%81%E4%B8%80%E8%87%B4%E7%9A%84%E5%8A%A0%E9%94%81%E9%A1%BA%E5%BA%8F%E5%90%A6%E5%88%99%E5%8F%AF%E8%83%BD%E4%BC%9A%E9%80%A0%E6%88%90%E6%AD%BB%E9%94%81">[红] 4.3.4 对多个资源、数据库表、对象同时加锁时，需要保持一致的加锁顺序，否则可能会造成死锁</a></li>
<li>=====<a href="#%E7%BA%A2-435-%E9%9C%80%E8%A6%81%E4%BD%BF%E7%94%A8%E5%AE%9A%E6%97%B6%E5%99%A8%E6%97%B6%E4%BD%BF%E7%94%A8scheduledexecutorservice%E6%89%A7%E8%A1%8C%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E8%80%8C%E4%B8%8D%E6%98%AF%E4%BD%BF%E7%94%A8timer%E8%8C%83%E4%BE%8B">[红] 4.3.5 需要使用定时器时，使用ScheduledExecutorService执行定时任务，而不是使用Timer。范例：</a></li>
</ul>
</li>
<li><a href="#44-%E7%B1%BB">4.4 类</a><ul>
<li><a href="#%E7%BA%A2-441-%E5%8F%AA%E6%9C%89%E4%B8%80%E4%B8%AA%E9%A1%B6%E7%BA%A7%E7%B1%BB%E5%A3%B0%E6%98%8E%E6%AF%8F%E4%B8%AA%E9%A1%B6%E7%BA%A7%E7%B1%BB%E9%83%BD%E5%9C%A8%E4%B8%80%E4%B8%AA%E4%B8%8E%E5%AE%83%E5%90%8C%E5%90%8D%E7%9A%84%E6%BA%90%E6%96%87%E4%BB%B6%E4%B8%AD%E5%BD%93%E7%84%B6%E8%BF%98%E5%8C%85%E5%90%ABjava%E5%90%8E%E7%BC%80">[红] 4.4.1 只有一个顶级类声明，每个顶级类都在一个与它同名的源文件中(当然，还包含<code>.java</code>后缀)。</a></li>
<li><a href="#%E7%BA%A2-442-%E6%89%80%E6%9C%89%E9%87%8D%E5%86%99%E7%9A%84%E6%96%B9%E6%B3%95%E5%BF%85%E9%A1%BB%E5%8A%A0%E4%B8%8Aoverride%E7%9A%84%E6%B3%A8%E8%A7%A3">[红] 4.4.2 所有重写的方法必须加上@Override的注解</a></li>
<li>=====<a href="#%E7%BA%A2-443-%E7%B1%BB%E6%88%90%E5%91%98%E9%A1%BA%E5%BA%8F%E8%A6%81%E5%81%9A%E5%88%B0public%E7%9A%84%E6%88%90%E5%91%98%E5%9C%A8%E5%89%8Dprotected%E5%92%8Cprivate%E7%9A%84%E6%88%90%E5%91%98%E4%BE%9D%E6%AC%A1%E6%8E%92%E5%9C%A8%E5%90%8E%E9%9D%A2">[红] 4.4.3 类成员顺序要做到public的成员在前，protected和private的成员依次排在后面</a></li>
<li><a href="#%E9%BB%84-444-%E7%B1%BB%E6%88%90%E5%91%98%E4%B8%8E%E6%96%B9%E6%B3%95%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E4%BB%8E%E4%B8%A5">[黄] 4.4.4 类成员与方法访问控制从严</a></li>
<li><a href="#%E7%BA%A2-445-%E5%BD%93%E4%B8%80%E4%B8%AA%E7%B1%BB%E6%9C%89%E5%A4%9A%E4%B8%AA%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E6%88%96%E6%98%AF%E5%A4%9A%E4%B8%AA%E5%90%8C%E5%90%8D%E6%96%B9%E6%B3%95%E8%BF%99%E4%BA%9B%E5%87%BD%E6%95%B0%E6%96%B9%E6%B3%95%E5%BA%94%E8%AF%A5%E6%8C%89%E9%A1%BA%E5%BA%8F%E5%87%BA%E7%8E%B0%E5%9C%A8%E4%B8%80%E8%B5%B7%E4%B8%AD%E9%97%B4%E4%B8%8D%E8%A6%81%E6%94%BE%E8%BF%9B%E5%85%B6%E5%AE%83%E5%87%BD%E6%95%B0%E6%96%B9%E6%B3%95">[红] 4.4.5 当一个类有多个构造函数，或是多个同名方法，这些函数/方法应该按顺序出现在一起，中间不要放进其它函数/方法。</a></li>
</ul>
</li>
<li><a href="#45-java">4.5 Java</a><ul>
<li><a href="#%E7%BA%A2-451-override%E8%83%BD%E7%94%A8%E5%88%99%E7%94%A8">[红] 4.5.1 <code>@Override</code>：能用则用</a></li>
<li><a href="#%E7%BA%A2-452-%E6%8D%95%E8%8E%B7%E7%9A%84%E5%BC%82%E5%B8%B8%E4%B8%8D%E8%83%BD%E5%BF%BD%E8%A7%86">[红] 4.5.2 捕获的异常：不能忽视</a></li>
<li><a href="#%E7%BA%A2-453-%E9%9D%99%E6%80%81%E6%88%90%E5%91%98%E4%BD%BF%E7%94%A8%E7%B1%BB%E8%BF%9B%E8%A1%8C%E8%B0%83%E7%94%A8">[红] 4.5.3 静态成员：使用类进行调用</a></li>
<li><a href="#%E7%BA%A2-454-finalizers-%E7%A6%81%E7%94%A8">[红] 4.5.4 Finalizers: 禁用</a></li>
<li><a href="#%E7%BA%A2-455-%E4%B8%8D%E8%AE%BA%E4%BD%95%E6%97%B6%E4%B8%8D%E5%85%81%E8%AE%B8%E6%9C%89%E5%8D%95%E8%AF%8D%E6%8B%BC%E5%86%99%E9%94%99%E8%AF%AF%E5%B9%B6%E6%8C%81%E7%BB%AD%E5%85%BC%E5%AE%B9%E8%BF%99%E7%A7%8D%E9%94%99%E8%AF%AF%E6%9C%89%E6%97%B6%E5%80%99%E5%85%B6%E5%AE%9E%E5%B9%B6%E6%B2%A1%E9%82%A3%E4%B9%88%E9%9A%BE">[红] 4.5.5 不论何时，不允许有单词拼写错误，并持续兼容这种错误有时候其实并没那么难</a></li>
<li><a href="#%E7%BA%A2-456-%E4%B8%8D%E8%AE%BA%E4%BD%95%E6%97%B6%E4%B8%8D%E5%85%81%E8%AE%B8%E5%9C%A8%E4%BB%A3%E7%A0%81%E4%B8%AD%E5%87%BA%E7%8E%B0%E9%AD%94%E6%B3%95%E6%95%B0%E5%AD%97">[红] 4.5.6 不论何时，不允许在代码中出现魔法数字</a></li>
<li><a href="#%E7%BA%A2-457-%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0%E5%8F%98%E9%87%8F%E5%91%BD%E5%90%8D%E8%A6%81%E6%9C%89%E6%84%8F%E4%B9%89">[红] 4.5.7 函数参数变量命名要有意义</a></li>
<li><a href="#%E7%BA%A2-458-%E6%9D%A1%E4%BB%B6%E5%88%A4%E6%96%AD%E8%AF%AD%E5%8F%A5%E4%B8%ADboolean%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%88%A4%E6%96%AD%E6%9D%A1%E4%BB%B6%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8">[红] 4.5.8 条件判断语句中，boolean类型的判断条件不能使用<code>==</code></a></li>
<li><a href="#%E7%BA%A2-459-%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%8D%E5%85%81%E8%AE%B8%E7%94%A8--%E8%BF%90%E7%AE%97%E7%AC%A6%E8%BF%9B%E8%A1%8C%E6%AF%94%E8%BE%83">[红] 4.5.9 字符串不允许用 == 运算符进行比较</a></li>
<li><a href="#%E7%BA%A2-4510-%E4%BB%A3%E7%A0%81%E4%B8%AD%E4%B8%8D%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8%E7%A1%AC%E7%BC%96%E7%A0%81%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2">[红] 4.5.10 代码中不允许使用硬编码的字符串</a></li>
<li><a href="#%E9%BB%84-4511-%E5%B8%B8%E9%87%8F%E7%9A%84%E5%A4%8D%E7%94%A8%E5%B1%82%E6%AC%A1%E6%9C%89%E4%BA%94%E5%B1%82%E8%B7%A8%E5%BA%94%E7%94%A8%E5%85%B1%E4%BA%AB%E5%B8%B8%E9%87%8F%E5%BA%94%E7%94%A8%E5%86%85%E5%85%B1%E4%BA%AB%E5%B8%B8%E9%87%8F%E5%AD%90%E5%B7%A5%E7%A8%8B%E5%86%85%E5%85%B1%E4%BA%AB%E5%B8%B8%E9%87%8F%E5%8C%85%E5%86%85%E5%85%B1%E4%BA%AB%E5%B8%B8%E9%87%8F%E7%B1%BB%E5%86%85%E5%85%B1%E4%BA%AB%E5%B8%B8%E9%87%8F">[黄] 4.5.11 常量的复用层次有五层：跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量</a></li>
<li><a href="#%E7%BA%A2-4512-%E5%AF%B9%E4%BA%8Exxutils%E7%B1%BB%E7%BB%9F%E4%B8%80%E5%91%BD%E5%90%8D%E4%B8%BAxxxutils%E5%B9%B6%E4%B8%94%E5%B0%86%E6%9E%84%E9%80%A0%E5%99%A8%E7%A7%81%E6%9C%89%E6%89%80%E6%9C%89%E7%9A%84%E6%96%B9%E6%B3%95%E9%83%BD%E5%BA%94%E8%AF%A5%E6%98%AFstatic%E7%9A%84%E5%AF%B9%E5%A4%96%E6%9A%B4%E9%9C%B2%E7%9A%84%E6%96%B9%E6%B3%95%E6%98%AFpublic%E7%9A%84%E5%B9%B6%E4%B8%94%E7%B1%BB%E6%98%AF%E4%B8%8D%E5%8F%AF%E8%A2%AB%E7%BB%A7%E6%89%BF%E7%9A%84%E5%8D%B3">[红] 4.5.12 对于XXUtils类统一命名为XXXUtils并且将构造器私有，所有的方法都应该是static的，对外暴露的方法是public的,并且类是不可被继承的，即:</a></li>
<li><a href="#%E7%BA%A2-4513-%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E6%B5%81%E6%89%93%E5%BC%80%E4%B8%80%E5%AE%9A%E8%A6%81%E5%9C%A8finally%E4%B8%AD%E5%85%B3%E9%97%AD%E5%90%A6%E5%88%99%E4%BC%9A%E9%80%A0%E6%88%90%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E5%8F%82%E8%80%83%E4%BB%A3%E7%A0%81">[红] 4.5.13 输入/输出流打开一定要在finally中关闭，否则会造成内存泄漏，参考代码：</a></li>
<li><a href="#%E7%BA%A2-4514-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%BC%96%E7%A8%8B%E6%97%B6%E5%AF%B9%E4%BA%92%E6%96%A5%E8%B5%84%E6%BA%90%E7%9A%84%E4%BF%AE%E6%94%B9%E4%B8%8D%E8%83%BD%E5%90%8C%E6%AD%A5%E8%BF%94%E5%9B%9E%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87future%E6%96%B9%E5%BC%8F%E8%BF%94%E5%9B%9E%E6%88%96%E8%80%85%E6%8F%90%E4%BE%9Blistener%E4%BD%86%E7%B1%BB%E4%BC%BC%E4%BA%8E%E8%BF%99%E6%A0%B7%E7%9A%84%E4%BB%A3%E7%A0%81%E6%98%AF%E4%B8%8D%E8%A2%AB%E5%85%81%E8%AE%B8%E7%9A%84">[红] 4.5.14 多线程编程时，对互斥资源的修改不能同步返回，可以通过Future方式返回或者提供listener，但类似于这样的代码是不被允许的：</a></li>
<li><a href="#%E7%BA%A2-4515-%E7%B1%BB%E6%9E%84%E9%80%A0%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9A%E4%B9%89%E8%A6%81%E5%9C%A8%E4%B8%80%E8%B5%B7%E5%AE%9A%E4%B9%89%E4%B8%8D%E8%83%BD%E9%9A%94%E4%BA%86%E5%87%A0%E4%B8%AA%E6%88%90%E5%91%98%E6%96%B9%E6%B3%95%E5%8F%88%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E6%9E%84%E9%80%A0%E5%99%A8%E4%BE%8B%E5%A6%82">[红] 4.5.15 类构造方法的定义要在一起定义，不能隔了几个成员方法又定义一个构造器。例如：</a></li>
<li>=====<a href="#%E7%BA%A2-4516-%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E8%A6%81%E6%B3%A8%E6%84%8F%E6%98%AF%E6%97%A0%E5%8F%82%E7%9A%84%E4%B8%8D%E5%8F%AF%E4%BB%A5%E5%87%BA%E7%8E%B0-getinstancecontext%E8%BF%99%E6%A0%B7%E7%9A%84%E6%96%B9%E6%B3%95%E6%9C%89%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E5%A6%82%E6%9E%9C%E9%9C%80%E8%A6%81%E5%9C%A8%E4%B8%80%E4%B8%AA%E5%8D%95%E4%BE%8B%E7%B1%BB%E4%B8%AD%E7%94%A8%E5%88%B0context%E8%AF%B7%E4%BD%BF%E7%94%A8application%E7%9A%84context">[红] 4.5.16 单例模式要注意是无参的！不可以出现 getInstance(context);这样的方法，有内存泄漏，如果需要在一个单例类中用到context，请使用application的context</a></li>
<li><a href="#%E7%BA%A2-4517-%E4%B8%8D%E9%80%9A%E8%BF%87%E4%B8%80%E4%B8%AA%E7%B1%BB%E7%9A%84%E5%AF%B9%E8%B1%A1%E8%AE%BF%E9%97%AE%E6%AD%A4%E7%B1%BB%E7%9A%84%E9%9D%99%E6%80%81%E5%8F%98%E9%87%8F%E6%88%96%E8%80%85%E6%96%B9%E6%B3%95">[红] 4.5.17 不通过一个类的对象访问此类的静态变量或者方法</a></li>
<li><a href="#%E9%BB%84-4518-%E5%B0%BD%E9%87%8F%E5%B0%91%E7%94%A8%E5%8F%AF%E5%8F%98%E5%8F%82%E6%95%B0%E7%BC%96%E7%A8%8B%E7%94%A8%E6%95%B0%E7%BB%84%E6%88%96%E8%80%85%E5%AE%B9%E5%99%A8%E6%9B%B4%E7%9B%B4%E8%A7%82">[黄] 4.5.18 尽量少用可变参数编程，用数组或者容器更直观</a></li>
<li><a href="#%E7%BA%A2-4519-%E5%AF%B9%E5%A4%96%E6%9A%B4%E9%9C%B2%E7%9A%84%E9%9D%9Eprivate%E6%96%B9%E6%B3%95%E5%8E%9F%E5%88%99%E4%B8%8A%E4%B8%8D%E5%85%81%E8%AE%B8%E4%BF%AE%E6%94%B9%E5%87%BD%E6%95%B0%E7%AD%BE%E5%90%8D%E5%9C%A8%E5%8F%91%E5%B8%83%E7%9A%84%E6%97%B6%E5%80%99%E8%AF%B7%E4%BB%94%E7%BB%86%E6%A3%80%E6%9F%A5%E6%98%AF%E5%90%A6%E6%9C%89%E6%8B%BC%E5%86%99%E9%94%99%E8%AF%AF%E6%88%96%E8%80%85%E5%8F%82%E6%95%B0%E9%94%99%E8%AF%AF%E5%8E%9F%E5%88%99%E4%B8%8A%E4%B8%8D%E5%85%81%E8%AE%B8%E5%88%A0%E9%99%A4%E4%BF%AE%E6%94%B9%E5%A6%82%E6%9E%9C%E4%B8%8D%E5%86%8D%E6%8E%A8%E8%8D%90%E4%BD%BF%E7%94%A8%E8%AF%B7%E6%89%93%E4%B8%8Adeprecated%E6%B3%A8%E8%A7%A3%E5%B9%B6%E6%98%8E%E7%A1%AE%E8%AF%B4%E6%98%8E%E6%96%B0%E6%8E%A5%E5%8F%A3">[红] 4.5.19 对外暴露的非private方法，原则上不允许修改函数签名，在发布的时候请仔细检查是否有拼写错误或者参数错误，原则上不允许删除，修改。如果不再推荐使用请打上@Deprecated注解并明确说明新接口</a></li>
<li><a href="#%E9%BB%84-4520-%E4%B8%8D%E4%BD%BF%E7%94%A8sdk%E6%A0%87%E6%B3%A8%E7%9A%84deprecated%E6%96%B9%E6%B3%95">[黄] 4.5.20 不使用sdk标注的@Deprecated方法</a></li>
<li><a href="#%E7%BA%A2-4521-object%E7%9A%84equals%E6%96%B9%E6%B3%95%E5%AE%B9%E6%98%93%E6%8A%9B%E7%A9%BA%E6%8C%87%E9%92%88%E5%BC%82%E5%B8%B8%E5%BA%94%E4%BD%BF%E7%94%A8%E5%B8%B8%E9%87%8F%E6%88%96%E7%A1%AE%E5%AE%9A%E6%9C%89%E5%80%BC%E7%9A%84%E5%AF%B9%E8%B1%A1%E6%9D%A5%E8%B0%83%E7%94%A8equals">[红] 4.5.21 Object的equals方法容易抛空指针异常，应使用常量或确定有值的对象来调用equals</a></li>
<li><a href="#%E7%BA%A2-4522-%E6%89%80%E6%9C%89%E5%8C%85%E8%A3%85%E7%B1%BB%E6%99%BA%E8%83%BD%E4%BD%BF%E7%94%A8equals%E8%BF%9B%E8%A1%8C%E6%AF%94%E8%BE%83%E4%B8%8D%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8">[红] 4.5.22 所有包装类智能使用equals进行比较不可以使用==</a></li>
<li><a href="#%E9%BB%84-4523-%E6%9E%84%E9%80%A0%E6%96%B9%E6%B3%95%E4%B8%AD%E4%B8%8D%E5%85%81%E8%AE%B8%E5%8A%A0%E5%85%A5%E4%BB%BB%E4%BD%95%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E5%A6%82%E6%9E%9C%E9%9C%80%E8%A6%81%E8%AF%B7%E6%94%BE%E5%88%B0init%E4%B8%AD">[黄] 4.5.23 构造方法中不允许加入任何业务逻辑，如果需要，请放到init()中</a></li>
<li><a href="#%E7%BA%A2-4524-%E4%B8%8D%E5%9C%A8%E5%BE%AA%E7%8E%AF%E4%BD%93%E5%86%85%E8%BF%9B%E8%A1%8C%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%8B%BC%E6%8E%A5%E5%A6%82%E6%9E%9C%E9%9C%80%E8%A6%81%E8%AF%B7%E7%94%A8stringbuilder">[红] 4.5.24 不在循环体内进行字符串的拼接，如果需要请用StringBuilder</a></li>
<li><a href="#%E7%BA%A2-4525-%E6%85%8E%E7%94%A8clone%E5%87%BD%E6%95%B0%E8%BF%9B%E8%A1%8C%E6%8B%B7%E8%B4%9D%E5%AE%83%E6%98%AF%E6%B5%85%E6%8B%B7%E8%B4%9D">[红] 4.5.25 慎用clone函数进行拷贝，它是浅拷贝</a></li>
<li><a href="#%E7%BA%A2-4526-%E5%AF%B9%E4%BA%8E%E5%A6%82%E4%B8%8B%E6%83%85%E5%86%B5%E8%A6%81%E4%BD%BF%E7%94%A8%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F">[红] 4.5.26 对于如下情况，要使用单例模式：</a></li>
<li><a href="#%E7%BA%A2-4527-android%E5%AE%8F%E6%8E%A7%E5%88%B6%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%B1%9E%E6%80%A7%E5%90%8D%E7%A7%B0%E5%BA%94%E8%AF%A5%E6%98%AFro%E5%BC%80%E5%A4%B4%E5%B1%9E%E6%80%A7%E5%BA%94%E8%AF%A5%E5%BD%93%E5%81%9A%E5%B8%B8%E9%87%8F%E6%9D%A5%E4%BD%BF%E7%94%A8%E4%B8%8D%E7%94%A8%E6%AF%8F%E6%AC%A1%E9%83%BD%E6%9D%A5%E8%AF%BB%E5%8F%96%E5%B1%9E%E6%80%A7">[红] 4.5.27 android宏控制类型的属性名称应该是ro.开头;属性应该当做常量来使用，不用每次都来读取属性。</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<!-- /TOC -->

<p><a id="markdown-1-源文件要求" name="1-源文件要求"></a></p>
<h1 id="1-源文件要求"><a href="#1-源文件要求" class="headerlink" title="1. 源文件要求"></a>1. 源文件要求</h1><p><a id="markdown-11-文件名" name="11-文件名"></a></p>
<h2 id="1-1-文件名"><a href="#1-1-文件名" class="headerlink" title="1.1 文件名"></a>1.1 文件名</h2><p><a id="markdown-红-111-源文件以其最顶层的类名来命名大小写敏感文件扩展名为java" name="红-111-源文件以其最顶层的类名来命名大小写敏感文件扩展名为java"></a></p>
<h3 id="红-1-1-1-源文件以其最顶层的类名来命名，大小写敏感，文件扩展名为-java"><a href="#红-1-1-1-源文件以其最顶层的类名来命名，大小写敏感，文件扩展名为-java" class="headerlink" title="[红] 1.1.1 源文件以其最顶层的类名来命名，大小写敏感，文件扩展名为.java"></a>[红] 1.1.1 源文件以其最顶层的类名来命名，大小写敏感，文件扩展名为<code>.java</code></h3><p><a id="markdown-红-112-源文件编码格式为utf-8" name="红-112-源文件编码格式为utf-8"></a></p>
<h3 id="红-1-1-2-源文件编码格式为UTF-8"><a href="#红-1-1-2-源文件编码格式为UTF-8" class="headerlink" title="[红] 1.1.2 源文件编码格式为UTF-8"></a>[红] 1.1.2 源文件编码格式为<code>UTF-8</code></h3><p><a id="markdown-12-特殊字符" name="12-特殊字符"></a></p>
<h2 id="1-2-特殊字符"><a href="#1-2-特殊字符" class="headerlink" title="1.2 特殊字符"></a>1.2 特殊字符</h2><p><a id="markdown-黄-121-除了行结束符序列ascii水平空格字符0x20即空格是源文件中唯一允许出现的空白字符" name="黄-121-除了行结束符序列ascii水平空格字符0x20即空格是源文件中唯一允许出现的空白字符"></a></p>
<h3 id="黄-1-2-1-除了行结束符序列，ASCII水平空格字符-0x20，即空格-是源文件中唯一允许出现的空白字符"><a href="#黄-1-2-1-除了行结束符序列，ASCII水平空格字符-0x20，即空格-是源文件中唯一允许出现的空白字符" class="headerlink" title="[黄] 1.2.1 除了行结束符序列，ASCII水平空格字符(0x20，即空格)是源文件中唯一允许出现的空白字符"></a>[黄] 1.2.1 除了行结束符序列，ASCII水平空格字符(0x20，即空格)是源文件中唯一允许出现的空白字符</h3><p>这意味着：</p>
<ol>
<li>所有其它字符串中的空白字符都要进行转义</li>
<li>制表符不用于缩进</li>
</ol>
<p><a id="markdown-红-122-对于具有特殊转义序列的任何字符\b-\t-\n-\f-\r我们使用它的转义序列而不是相应的八进制比如\012或unicode比如\u000a转义" name="红-122-对于具有特殊转义序列的任何字符\b-\t-\n-\f-\r我们使用它的转义序列而不是相应的八进制比如\012或unicode比如\u000a转义"></a></p>
<h3 id="红-1-2-2-对于具有特殊转义序列的任何字符-b-t-n-f-r-，我们使用它的转义序列，而不是相应的八进制-比如-012-或Unicode-比如-u000a-转义"><a href="#红-1-2-2-对于具有特殊转义序列的任何字符-b-t-n-f-r-，我们使用它的转义序列，而不是相应的八进制-比如-012-或Unicode-比如-u000a-转义" class="headerlink" title="[红] 1.2.2 对于具有特殊转义序列的任何字符(\b, \t, \n, \f, \r)，我们使用它的转义序列，而不是相应的八进制(比如\012)或Unicode(比如\u000a)转义"></a>[红] 1.2.2 对于具有特殊转义序列的任何字符(<code>\b, \t, \n, \f, \r</code>)，我们使用它的转义序列，而不是相应的八进制(比如<code>\012</code>)或Unicode(比如<code>\u000a</code>)转义</h3><p>查阅<a target="_blank" rel="noopener" href="http://zh.wikipedia.org/wiki/%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97">转义序列</a>。</p>
<p><a id="markdown-红-123-对于剩余的非ascii字符是使用实际的unicode字符比如∞还是使用等价的unicode转义符比如\u221e取决于哪个能让代码更易于阅读和理解" name="红-123-对于剩余的非ascii字符是使用实际的unicode字符比如∞还是使用等价的unicode转义符比如\u221e取决于哪个能让代码更易于阅读和理解"></a></p>
<h3 id="红-1-2-3-对于剩余的非ASCII字符，是使用实际的Unicode字符-比如∞-，还是使用等价的Unicode转义符-比如-u221e-，取决于哪个能让代码更易于阅读和理解"><a href="#红-1-2-3-对于剩余的非ASCII字符，是使用实际的Unicode字符-比如∞-，还是使用等价的Unicode转义符-比如-u221e-，取决于哪个能让代码更易于阅读和理解" class="headerlink" title="[红] 1.2.3 对于剩余的非ASCII字符，是使用实际的Unicode字符(比如∞)，还是使用等价的Unicode转义符(比如\u221e)，取决于哪个能让代码更易于阅读和理解"></a>[红] 1.2.3 对于剩余的非ASCII字符，是使用实际的Unicode字符(比如<code>∞</code>)，还是使用等价的Unicode转义符(比如<code>\u221e</code>)，取决于哪个能让代码更易于阅读和理解</h3><blockquote>
<p>Tip: 在使用Unicode转义符或是一些实际的Unicode字符时，建议做些注释给出解释，这有助于别人阅读和理解。<br>例如：</p>
</blockquote>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">String unitAbbrev = <span class="string">&quot;μs&quot;</span>;</span><br><span class="line">^ 赞，即使没有注释也非常清晰</span><br><span class="line">String unitAbbrev = <span class="string">&quot;\u03bcs&quot;</span>; <span class="comment">// &quot;μs&quot;</span></span><br><span class="line">^ 允许，但没有理由要这样做</span><br><span class="line">String unitAbbrev = <span class="string">&quot;\u03bcs&quot;</span>; <span class="comment">// Greek letter mu, &quot;s&quot;</span></span><br><span class="line">^ 允许，但这样做显得笨拙还容易出错</span><br><span class="line">String unitAbbrev = <span class="string">&quot;\u03bcs&quot;</span>;</span><br><span class="line">^ 很糟，读者根本看不出这是什么</span><br><span class="line"><span class="keyword">return</span> <span class="string">&#x27;\ufeff&#x27;</span> + content; <span class="comment">// byte order mark</span></span><br><span class="line">^ Good，对于非打印字符，使用转义，并在必要时写上注释</span><br></pre></td></tr></table></figure>
<blockquote>
<p>Tip: 永远不要由于害怕某些程序可能无法正确处理非ASCII字符而让你的代码可读性变差。当程序无法正确处理非ASCII字符时，它自然无法正确运行， 你就会去fix这些问题的了。(言下之意就是大胆去用非ASCII字符，如果真的有需要的话)</p>
</blockquote>
<p><a id="markdown-13-源文件结构" name="13-源文件结构"></a></p>
<h2 id="1-3-源文件结构"><a href="#1-3-源文件结构" class="headerlink" title="1.3 源文件结构"></a>1.3 源文件结构</h2><p><a id="markdown-黄-131-一个源文件包含按顺序地" name="黄-131-一个源文件包含按顺序地"></a></p>
<h3 id="黄-1-3-1-一个源文件包含-按顺序地-："><a href="#黄-1-3-1-一个源文件包含-按顺序地-：" class="headerlink" title="[黄] 1.3.1 一个源文件包含(按顺序地)："></a>[黄] 1.3.1 一个源文件包含(按顺序地)：</h3><ol>
<li>许可证或版权信息(如有需要)</li>
<li>package语句</li>
<li>import语句</li>
<li>一个顶级类(<strong>只有一个</strong>)</li>
</ol>
<p>以上每个部分之间用一个空行隔开。</p>
<p><a id="markdown-黄-132-如果一个文件包含许可证或版权信息那么它应当被放在文件最前面" name="黄-132-如果一个文件包含许可证或版权信息那么它应当被放在文件最前面"></a></p>
<h3 id="黄-1-3-2-如果一个文件包含许可证或版权信息，那么它应当被放在文件最前面。"><a href="#黄-1-3-2-如果一个文件包含许可证或版权信息，那么它应当被放在文件最前面。" class="headerlink" title="[黄] 1.3.2 如果一个文件包含许可证或版权信息，那么它应当被放在文件最前面。"></a>[黄] 1.3.2 如果一个文件包含许可证或版权信息，那么它应当被放在文件最前面。</h3><p>由我们添加的模块源文件需要添加版权信息。</p>
<p>版权信息包含三部分：</p>
<ul>
<li>符号©（字母C外加一个圈），或者单词“Copyright”版权，或者缩写“Copr.”</li>
<li>作品初次公开发表的年份</li>
<li>作品的版权拥有者名称，或者可识别的拥有者名称缩写，或者是拥有者的其他为公众知晓的名称</li>
</ul>
<p>样例：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/////////////////////////////////////////////////////////////</span></span><br><span class="line"><span class="comment">// Copyright Statement: CVTE</span></span><br><span class="line"><span class="comment">// Copyright © 2017 Guangzhou Shiyuan Electronics Co.,Ltd.</span></span><br><span class="line"><span class="comment">// All rights reserved.</span></span><br><span class="line"><span class="comment">//      ____________        _______________  ___________</span></span><br><span class="line"><span class="comment">//     / / ________ \      / / _____   ____|| |  _______|</span></span><br><span class="line"><span class="comment">//    / / /      \ \ \    / / /   | | |     | | |</span></span><br><span class="line"><span class="comment">//   | | |        \ \ \  / / /    | | |     | | |_______</span></span><br><span class="line"><span class="comment">//   | | |         \ \ \/ / /     | | |     | |  _______|</span></span><br><span class="line"><span class="comment">//   | | |          \ \ \/ /      | | |     | | |</span></span><br><span class="line"><span class="comment">//    \ \ \______    \ \  /       | | |     | | |_______</span></span><br><span class="line"><span class="comment">//     \_\_______|    \_\/        |_|_|     |_|_________|</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">/////////////////////////////////////////////////////////////</span></span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-133-package语句不换行列限制并不适用于package语句即package语句写在一行里" name="红-133-package语句不换行列限制并不适用于package语句即package语句写在一行里"></a></p>
<h3 id="红-1-3-3-package语句不换行，列限制并不适用于package语句。-即package语句写在一行里"><a href="#红-1-3-3-package语句不换行，列限制并不适用于package语句。-即package语句写在一行里" class="headerlink" title="[红] 1.3.3 package语句不换行，列限制并不适用于package语句。(即package语句写在一行里)"></a>[红] 1.3.3 package语句不换行，列限制并不适用于package语句。(即package语句写在一行里)</h3><p><a id="markdown-134-import语句要求" name="134-import语句要求"></a></p>
<h3 id="1-3-4-import语句要求"><a href="#1-3-4-import语句要求" class="headerlink" title="1.3.4 import语句要求"></a>1.3.4 import语句要求</h3><ol>
<li>[红] import不要使用通配符，不要出现类似这样的import语句：<code>import java.util.*;</code></li>
<li>[红] import语句不换行，每个import语句独立成行</li>
<li>[红] import语句分为以下两个代码块，按照这个顺序，每组由一个空行分隔<ul>
<li>所有的静态导入独立成代码块</li>
<li>所有非静态imports独立成代码块</li>
</ul>
</li>
<li>[黄] 每个imports块内按报名的字典序排序</li>
</ol>
<p><a id="markdown-2-格式" name="2-格式"></a></p>
<h1 id="2-格式"><a href="#2-格式" class="headerlink" title="2. 格式"></a>2. 格式</h1><p><strong>术语说明</strong>：块状结构(block-like construct)指的是一个类，方法或构造函数的主体。需要注意的是，数组初始化中的初始值可被选择性地视为块状结构</p>
<p><a id="markdown-21-大括号" name="21-大括号"></a></p>
<h2 id="2-1-大括号"><a href="#2-1-大括号" class="headerlink" title="2.1 大括号"></a>2.1 大括号</h2><p><a id="markdown-红-211-大括号与if-else-for-do-while语句一起使用即使只有一条语句或是空也应该把大括号写上" name="红-211-大括号与if-else-for-do-while语句一起使用即使只有一条语句或是空也应该把大括号写上"></a></p>
<h3 id="红-2-1-1-大括号与if-else-for-do-while语句一起使用，即使只有一条语句-或是空-，也应该把大括号写上"><a href="#红-2-1-1-大括号与if-else-for-do-while语句一起使用，即使只有一条语句-或是空-，也应该把大括号写上" class="headerlink" title="[红] 2.1.1 大括号与if, else, for, do, while语句一起使用，即使只有一条语句(或是空)，也应该把大括号写上"></a>[红] 2.1.1 大括号与<code>if, else, for, do, while</code>语句一起使用，即使只有一条语句(或是空)，也应该把大括号写上</h3><p><a id="markdown-红-212-对于非空块和块状结构大括号遵循kernighan和ritchie风格-egyptian-brackets" name="红-212-对于非空块和块状结构大括号遵循kernighan和ritchie风格-egyptian-brackets"></a></p>
<h3 id="红-2-1-2-对于非空块和块状结构，大括号遵循Kernighan和Ritchie风格-Egyptian-brackets"><a href="#红-2-1-2-对于非空块和块状结构，大括号遵循Kernighan和Ritchie风格-Egyptian-brackets" class="headerlink" title="[红] 2.1.2 对于非空块和块状结构，大括号遵循Kernighan和Ritchie风格 (Egyptian brackets)"></a>[红] 2.1.2 对于非空块和块状结构，大括号遵循Kernighan和Ritchie风格 (Egyptian brackets)</h3><ul>
<li>左大括号前不换行</li>
<li>左大括号后换行</li>
<li>右大括号前换行</li>
<li>如果右大括号是一个语句、函数体或类的终止，则右大括号后换行; 否则不换行。例如，如果右大括号后面是else或逗号，则不换行。</li>
</ul>
<p>更多关于<a target="_blank" rel="noopener" href="http://www.codinghorror.com/blog/2012/07/new-programming-jargon.html">Egyptian brackets</a>的信息。</p>
<blockquote>
<p>示例：</p>
</blockquote>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">return</span> <span class="keyword">new</span> MyClass() &#123;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">method</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (condition()) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                something();</span><br><span class="line">            &#125; <span class="keyword">catch</span> (ProblemException e) &#123;</span><br><span class="line">                recover();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>
<p>枚举类的一些例外后面会讲到。</p>
<p><a id="markdown-红-213-如果它是一个多块语句的一部分ifelse或trycatchfinally即使大括号内没内容右大括号也要换行" name="红-213-如果它是一个多块语句的一部分ifelse或trycatchfinally即使大括号内没内容右大括号也要换行"></a></p>
<h3 id="红-2-1-3-如果它是一个多块语句的一部分-if-else或try-catch-finally-，即使大括号内没内容，右大括号也要换行"><a href="#红-2-1-3-如果它是一个多块语句的一部分-if-else或try-catch-finally-，即使大括号内没内容，右大括号也要换行" class="headerlink" title="[红] 2.1.3 如果它是一个多块语句的一部分(if/else或try/catch/finally)，即使大括号内没内容，右大括号也要换行"></a>[红] 2.1.3 如果它是一个多块语句的一部分(<code>if/else</code>或<code>try/catch/finally</code>)，即使大括号内没内容，右大括号也要换行</h3><p>示例：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">doNothing</span><span class="params">()</span> </span>&#123;&#125;</span><br><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line">    doSomething();</span><br><span class="line">&#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-22-空白" name="22-空白"></a></p>
<h2 id="2-2-空白"><a href="#2-2-空白" class="headerlink" title="2.2 空白"></a>2.2 空白</h2><p><a id="markdown-红-221-空行的使用" name="红-221-空行的使用"></a></p>
<h3 id="红-2-2-1-空行的使用"><a href="#红-2-2-1-空行的使用" class="headerlink" title="[红] 2.2.1 空行的使用"></a>[红] 2.2.1 空行的使用</h3><p>以下情况需要使用一个空行：</p>
<ol>
<li>类内连续的成员之间：字段，构造函数，方法，嵌套类，静态初始化块，实例初始化块。<br><em>例外</em>：两个连续字段之间的空行是可选的，用于字段的空行主要用来对字段进行逻辑分组。</li>
<li>在函数体内，语句的逻辑分组间使用空行。</li>
<li>类内的第一个成员前或最后一个成员后的空行是可选的(既不鼓励也不反对这样做，视个人喜好而定)。</li>
<li>要满足本文档中其他节的空行要求。</li>
</ol>
<p><a id="markdown-红-222-不允许多个连续的空行" name="红-222-不允许多个连续的空行"></a></p>
<h3 id="红-2-2-2-不允许多个连续的空行"><a href="#红-2-2-2-不允许多个连续的空行" class="headerlink" title="[红] 2.2.2 不允许多个连续的空行"></a>[红] 2.2.2 不允许多个连续的空行</h3><p><a id="markdown-红-223-空格的使用" name="红-223-空格的使用"></a></p>
<h3 id="红-2-2-3-空格的使用"><a href="#红-2-2-3-空格的使用" class="headerlink" title="[红] 2.2.3 空格的使用"></a>[红] 2.2.3 空格的使用</h3><p>除了语言需求和其它规则，并且除了文字，注释和<code>Javadoc</code>用到单个空格，单个<code>ASCII</code>空格也出现在以下几个地方：</p>
<ol>
<li>分隔任何保留字与紧随其后的左括号(<code>(</code>)(如<code>if, for catch</code>等)。</li>
<li>分隔任何保留字与其前面的右大括号(<code>&#125;</code>)(如<code>else, catch</code>)。</li>
<li>在任何左大括号前(<code>&#123;</code>)，两个例外：<ul>
<li><code>@SomeAnnotation(&#123;a, b&#125;)</code>(不使用空格)。</li>
<li><code>String[][] x = foo;</code>(大括号间没有空格，见下面的Note)。</li>
</ul>
</li>
<li>在任何二元或三元运算符的两侧。这也适用于以下“类运算符”符号：<ul>
<li>类型界限中的&amp;(<code>&lt;T extends Foo &amp; Bar&gt;</code>)。</li>
<li>catch块中的管道符号(<code>catch (FooException | BarException e</code>)。</li>
<li><code>foreach</code>语句中的分号。</li>
</ul>
</li>
<li>在<code>, : ;</code>及右括号<code>)</code>后。</li>
<li>如果在一条语句后做注释，则双斜杠(<code>//</code>)两边都要空格。这里可以允许多个空格，但没有必要。</li>
<li>类型和变量之间：List<string> list。</string></li>
<li>数组初始化中，大括号内的空格是可选的，即<code>new int[] &#123;5, 6&#125;</code>和<code>new int[] &#123; 5, 6 &#125;</code>都是可以的。</li>
</ol>
<blockquote>
<p>Note：这个规则并不要求或禁止一行的开关或结尾需要额外的空格，只对内部空格做要求。</p>
</blockquote>
<p><a id="markdown-黄-224-不要做水平对齐" name="黄-224-不要做水平对齐"></a></p>
<h3 id="黄-2-2-4-不要做水平对齐"><a href="#黄-2-2-4-不要做水平对齐" class="headerlink" title="[黄] 2.2.4 不要做水平对齐"></a>[黄] 2.2.4 不要做水平对齐</h3><p><em>术语说明</em>：水平对齐指的是通过增加可变数量的空格来使某一行的字符与上一行的相应字符对齐。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">int</span> x; <span class="comment">// this is fine</span></span><br><span class="line"><span class="keyword">private</span> Color color; <span class="comment">// this too</span></span><br><span class="line"><span class="keyword">private</span> <span class="keyword">int</span>   x;      <span class="comment">// permitted, but future edits</span></span><br><span class="line"><span class="keyword">private</span> Color color;  <span class="comment">// may leave it unaligned</span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>Tip：对齐可增加代码可读性，但它为日后的维护带来问题。考虑未来某个时候，我们需要修改一堆对齐的代码中的一行。 这可能导致原本很漂亮的对齐代码变得错位。很可能它会提示你调整周围代码的空白来使这一堆代码重新水平对齐(比如程序员想保持这种水平对齐的风格)， 这就会让你做许多的无用功，增加了reviewer的工作并且可能导致更多的合并冲突。</p>
</blockquote>
<p><a id="markdown-红-225-不允许有超过3层的if嵌套" name="红-225-不允许有超过3层的if嵌套"></a></p>
<h3 id="红-2-2-5-不允许有超过3层的if嵌套"><a href="#红-2-2-5-不允许有超过3层的if嵌套" class="headerlink" title="[红] 2.2.5 不允许有超过3层的if嵌套"></a>[红] 2.2.5 不允许有超过3层的if嵌套</h3><p>if如果嵌套过深，阅读主干代码的精力就会被一层层if慢慢消耗殆尽，因为你必须时刻记住为什么会进这个if，这时就要进行重构。<br>多重嵌套主要有两种情况：</p>
<ol>
<li><p>复杂的判断逻辑</p>
</li>
<li><p>排除各种异常情况<br>对于这两种情况参考处理方法如下：</p>
</li>
<li><p>复杂的判断逻辑：理清判断逻辑的意图，提取成函数。举例：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//Before</span></span><br><span class="line"><span class="keyword">if</span> ((money &gt;= <span class="number">500000</span>) &amp;&amp; (saveDay &gt;= <span class="number">30</span>)) &#123;</span><br><span class="line">    <span class="keyword">if</span> (transition.equals(STR_OFTEN)) &#123;</span><br><span class="line">        <span class="keyword">do</span> some things...</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//After</span></span><br><span class="line"><span class="keyword">if</span> (isGoodCustomer(money, saveDay, transition)) &#123;</span><br><span class="line">    <span class="keyword">do</span> some things...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">boolean</span> <span class="title">isGoodCustomer</span><span class="params">(<span class="keyword">int</span> money, <span class="keyword">int</span> saveDay, String transition)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> ((money &gt;= <span class="number">500000</span>) &amp;&amp; (saveDay &gt;= <span class="number">30</span>) &amp;&amp; transition.equals(STR_OFTEN)) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li>
<li><p>排除各种异常情况：使用卫词方法（Guard Clauses），先处理异常情况，最后处理正常情况。举例：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//Before</span></span><br><span class="line"><span class="keyword">if</span> (a != <span class="number">1</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (b != <span class="number">2</span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (c == <span class="number">3</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (d &gt; <span class="number">4</span>) &#123;</span><br><span class="line">                <span class="keyword">do</span> some things...</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//After</span></span><br><span class="line"><span class="keyword">if</span> (a == <span class="number">1</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (b == <span class="number">2</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (c != <span class="number">3</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (d &lt;= <span class="number">4</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">do</span> some things...</span><br></pre></td></tr></table></figure></li>
</ol>
<blockquote>
<p>参考链接：<br><a target="_blank" rel="noopener" href="http://www.cnblogs.com/ludashi/p/5257273.html">条件表达式重构规则</a><br><a target="_blank" rel="noopener" href="http://coolshell.cn/articles/17757.html">如何重构“箭头型”代码</a></p>
</blockquote>
<p><a id="markdown-红-226-任何运算符左右必须加一个空格" name="红-226-任何运算符左右必须加一个空格"></a></p>
<h3 id="红-2-2-6-任何运算符左右必须加一个空格"><a href="#红-2-2-6-任何运算符左右必须加一个空格" class="headerlink" title="[红] 2.2.6 任何运算符左右必须加一个空格"></a>[红] 2.2.6 任何运算符左右必须加一个空格</h3><blockquote>
<p>说明：运算符包括赋值运算符=、逻辑运算符&amp;&amp;、加减乘除符号、三目运行符等。</p>
</blockquote>
<p><a id="markdown-黄-227-用小括号来限定组" name="黄-227-用小括号来限定组"></a></p>
<h3 id="黄-2-2-7-用小括号来限定组"><a href="#黄-2-2-7-用小括号来限定组" class="headerlink" title="[黄] 2.2.7 用小括号来限定组"></a>[黄] 2.2.7 用小括号来限定组</h3><p>除非作者和reviewer都认为去掉小括号也不会使代码被误解，或是去掉小括号能让代码更易于阅读，否则我们不应该去掉小括号。我们没有理由假设读者能记住整个Java运算符优先级表。</p>
<p><a id="markdown-红-228-左括号和后一个字符之间不出现空格同样右括号和前一个字符之间也不出现空格" name="红-228-左括号和后一个字符之间不出现空格同样右括号和前一个字符之间也不出现空格"></a></p>
<h3 id="红-2-2-8-左括号和后一个字符之间不出现空格；同样，右括号和前一个字符之间也不出现空格"><a href="#红-2-2-8-左括号和后一个字符之间不出现空格；同样，右括号和前一个字符之间也不出现空格" class="headerlink" title="[红] 2.2.8 左括号和后一个字符之间不出现空格；同样，右括号和前一个字符之间也不出现空格"></a>[红] 2.2.8 左括号和后一个字符之间不出现空格；同样，右括号和前一个字符之间也不出现空格</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Sample</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">Sample</span><span class="params">(String param)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (isSample) &#123; <span class="comment">//Good</span></span><br><span class="line">            ......</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> ( isSample ) &#123; <span class="comment">//Bad</span></span><br><span class="line">            ......</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-229-ifforwhileswitchdo等保留字与左右括号之间都必须加空格" name="红-229-ifforwhileswitchdo等保留字与左右括号之间都必须加空格"></a></p>
<h3 id="红-2-2-9-if-for-while-switch-do等保留字与左右括号之间都必须加空格"><a href="#红-2-2-9-if-for-while-switch-do等保留字与左右括号之间都必须加空格" class="headerlink" title="[红] 2.2.9 if/for/while/switch/do等保留字与左右括号之间都必须加空格"></a>[红] 2.2.9 <code>if/for/while/switch/do</code>等保留字与左右括号之间都必须加空格</h3><p><a id="markdown-23-枚举" name="23-枚举"></a></p>
<h2 id="2-3-枚举"><a href="#2-3-枚举" class="headerlink" title="2.3 枚举"></a>2.3 枚举</h2><p><a id="markdown-红-231-枚举常量间用逗号隔开换行可选没有方法和文档的枚举类可写成数组初始化的格式" name="红-231-枚举常量间用逗号隔开换行可选没有方法和文档的枚举类可写成数组初始化的格式"></a></p>
<h3 id="红-2-3-1-枚举常量间用逗号隔开，换行可选，没有方法和文档的枚举类可写成数组初始化的格式"><a href="#红-2-3-1-枚举常量间用逗号隔开，换行可选，没有方法和文档的枚举类可写成数组初始化的格式" class="headerlink" title="[红] 2.3.1 枚举常量间用逗号隔开，换行可选，没有方法和文档的枚举类可写成数组初始化的格式"></a>[红] 2.3.1 枚举常量间用逗号隔开，换行可选，没有方法和文档的枚举类可写成数组初始化的格式</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="class"><span class="keyword">enum</span> <span class="title">Suit</span> </span>&#123; CLUBS, HEARTS, SPADES, DIAMONDS &#125;</span><br></pre></td></tr></table></figure>
<p><em>由于枚举类也是一个类，因此所有适用于其它类的格式规则也适用于枚举类。</em></p>
<p><a id="markdown-24-变量" name="24-变量"></a></p>
<h2 id="2-4-变量"><a href="#2-4-变量" class="headerlink" title="2.4 变量"></a>2.4 变量</h2><p><a id="markdown-红-241-每次只声明一个变量" name="红-241-每次只声明一个变量"></a></p>
<h3 id="红-2-4-1-每次只声明一个变量"><a href="#红-2-4-1-每次只声明一个变量" class="headerlink" title="[红] 2.4.1 每次只声明一个变量"></a>[红] 2.4.1 每次只声明一个变量</h3><p>不要使用组合声明，比如<code>int a, b;</code>。</p>
<p><a id="markdown-红-242-局部变量需要时才声明声明的同时要进行初始化" name="红-242-局部变量需要时才声明声明的同时要进行初始化"></a></p>
<h3 id="红-2-4-2-局部变量需要时才声明，声明的同时要进行初始化"><a href="#红-2-4-2-局部变量需要时才声明，声明的同时要进行初始化" class="headerlink" title="[红] 2.4.2 局部变量需要时才声明，声明的同时要进行初始化"></a>[红] 2.4.2 局部变量需要时才声明，声明的同时要进行初始化</h3><p>不要在一个代码块的开头把局部变量一次性都声明了(这是c语言的做法)，而是在第一次需要使用它时才声明。 局部变量在声明时最好就进行初始化，或者声明后尽快进行初始化。</p>
<p><a id="markdown-25-数组" name="25-数组"></a></p>
<h2 id="2-5-数组"><a href="#2-5-数组" class="headerlink" title="2.5 数组"></a>2.5 数组</h2><p><a id="markdown-黄-251-数组初始化可写成块状结构" name="黄-251-数组初始化可写成块状结构"></a></p>
<h3 id="黄-2-5-1-数组初始化：可写成块状结构"><a href="#黄-2-5-1-数组初始化：可写成块状结构" class="headerlink" title="[黄] 2.5.1 数组初始化：可写成块状结构"></a>[黄] 2.5.1 数组初始化：可写成块状结构</h3><p>数组初始化可以写成块状结构，比如，下面的写法都是OK的：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">new</span> <span class="keyword">int</span>[] &#123;</span><br><span class="line">    <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">new</span> <span class="keyword">int</span>[] &#123;</span><br><span class="line">    <span class="number">0</span>,</span><br><span class="line">    <span class="number">1</span>,</span><br><span class="line">    <span class="number">2</span>,</span><br><span class="line">    <span class="number">3</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">new</span> <span class="keyword">int</span>[] &#123;</span><br><span class="line">    <span class="number">0</span>, <span class="number">1</span>,</span><br><span class="line">    <span class="number">2</span>, <span class="number">3</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">new</span> <span class="keyword">int</span>[]&#123;<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-252-非c风格的数组声明" name="红-252-非c风格的数组声明"></a></p>
<h3 id="红-2-5-2-非C风格的数组声明"><a href="#红-2-5-2-非C风格的数组声明" class="headerlink" title="[红] 2.5.2 非C风格的数组声明"></a>[红] 2.5.2 非C风格的数组声明</h3><p>中括号是类型的一部分：<code>String[] args</code>， 而非<code>String args[]</code></p>
<p><a id="markdown-26-switch语句" name="26-switch语句"></a></p>
<h2 id="2-6-switch语句"><a href="#2-6-switch语句" class="headerlink" title="2.6 switch语句"></a>2.6 switch语句</h2><p><em>术语说明</em>：switch块的大括号内是一个或多个语句组。每个语句组包含一个或多个switch标签(<code>case FOO:</code>或<code>default:</code>)，后面跟着一条或多条语句。</p>
<p><a id="markdown-红-261-缩进" name="红-261-缩进"></a></p>
<h3 id="红-2-6-1-缩进"><a href="#红-2-6-1-缩进" class="headerlink" title="[红] 2.6.1 缩进"></a>[红] 2.6.1 缩进</h3><p>与其它块状结构一致，switch块中的内容缩进为4个空格。<br>每个switch标签后新起一行，再缩进4个空格，写下一条或多条语句。</p>
<p><a id="markdown-红-262-fall-through注释" name="红-262-fall-through注释"></a></p>
<h3 id="红-2-6-2-Fall-through：注释"><a href="#红-2-6-2-Fall-through：注释" class="headerlink" title="[红] 2.6.2 Fall-through：注释"></a>[红] 2.6.2 <code>Fall-through</code>：注释</h3><p>在一个switch块内，每个语句组要么通过<code>break, continue, return</code>或抛出异常来终止，要么通过一条注释来说明程序将继续执行到下一个语句组， 任何能表达这个意思的注释都是OK的(典型的是用<code>// fall through</code>)。这个特殊的注释并不需要在最后一个语句组(一般是<code>default</code>)中出现。示例：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">switch</span> (input) &#123;</span><br><span class="line">    <span class="keyword">case</span> ONE:</span><br><span class="line">    <span class="keyword">case</span> TWO:</span><br><span class="line">        prepareOneOrTwo();</span><br><span class="line">        <span class="comment">// fall through</span></span><br><span class="line">    <span class="keyword">case</span> THREE:</span><br><span class="line">        handleOneTwoOrThree();</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">default</span>:</span><br><span class="line">        handleLargeNumber(input);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-263-default的情况要写出来" name="红-263-default的情况要写出来"></a></p>
<h3 id="红-2-6-3-default的情况要写出来"><a href="#红-2-6-3-default的情况要写出来" class="headerlink" title="[红] 2.6.3 default的情况要写出来"></a>[红] 2.6.3 <code>default</code>的情况要写出来</h3><p>每个switch语句都包含一个<code>default</code>语句组，即使它什么代码也不包含</p>
<p><a id="markdown-27-注解annotations" name="27-注解annotations"></a></p>
<h2 id="2-7-注解-Annotations"><a href="#2-7-注解-Annotations" class="headerlink" title="2.7 注解(Annotations)"></a>2.7 注解(Annotations)</h2><p><a id="markdown-红-271-注解紧跟在文档块后面应用于类方法和构造函数一个注解独占一行这些换行不属于自动换行因此缩进级别不变" name="红-271-注解紧跟在文档块后面应用于类方法和构造函数一个注解独占一行这些换行不属于自动换行因此缩进级别不变"></a></p>
<h3 id="红-2-7-1-注解紧跟在文档块后面，应用于类、方法和构造函数，一个注解独占一行。这些换行不属于自动换行，因此缩进级别不变"><a href="#红-2-7-1-注解紧跟在文档块后面，应用于类、方法和构造函数，一个注解独占一行。这些换行不属于自动换行，因此缩进级别不变" class="headerlink" title="[红] 2.7.1 注解紧跟在文档块后面，应用于类、方法和构造函数，一个注解独占一行。这些换行不属于自动换行，因此缩进级别不变"></a>[红] 2.7.1 注解紧跟在文档块后面，应用于类、方法和构造函数，一个注解独占一行。这些换行不属于自动换行，因此缩进级别不变</h3><p>例如：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="meta">@Nullable</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> String <span class="title">getNameIfPresent</span><span class="params">()</span> </span>&#123; ... &#125;</span><br></pre></td></tr></table></figure>

<p>应用于字段的注解紧随文档块出现，应用于字段的多个注解允许与字段出现在同一行。例如：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Partial</span> <span class="meta">@Mock</span> DataLoader loader;</span><br></pre></td></tr></table></figure>

<p>参数和局部变量注解没有特定规则。</p>
<p><a id="markdown-28-注释" name="28-注释"></a></p>
<h2 id="2-8-注释"><a href="#2-8-注释" class="headerlink" title="2.8 注释"></a>2.8 注释</h2><p><a id="markdown-红-281-块注释风格" name="红-281-块注释风格"></a></p>
<h3 id="红-2-8-1-块注释风格"><a href="#红-2-8-1-块注释风格" class="headerlink" title="[红] 2.8.1 块注释风格"></a>[红] 2.8.1 块注释风格</h3><p>块注释与其周围的代码在同一缩进级别。它们可以是<code>/* ... */</code>风格，也可以是<code>// ...</code>风格。对于多行的<code>/* ... */</code>注释，后续行必须从<code>*</code>开始， 并且与前一行的<code>*</code>对齐。以下示例注释都是OK的。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * This is</span></span><br><span class="line"><span class="comment"> * okay.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// And so</span></span><br><span class="line"><span class="comment">// is this.</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/* Or you can</span></span><br><span class="line"><span class="comment"> * even do this. */</span></span><br></pre></td></tr></table></figure>
<p>注释不要封闭在由星号或其它字符绘制的框架里。</p>
<blockquote>
<p>Tip：在写多行注释时，如果你希望在必要时能重新换行(即注释像段落风格一样)，那么使用<code>/* ... */</code>。</p>
</blockquote>
<p><a id="markdown-黄-282-修复bug需要增加注释解决了什么bugbug原因通过何种方式" name="黄-282-修复bug需要增加注释解决了什么bugbug原因通过何种方式"></a></p>
<h3 id="黄-2-8-2-修复bug需要增加注释，解决了什么bug，bug原因，通过何种方式"><a href="#黄-2-8-2-修复bug需要增加注释，解决了什么bug，bug原因，通过何种方式" class="headerlink" title="[黄] 2.8.2 修复bug需要增加注释，解决了什么bug，bug原因，通过何种方式"></a>[黄] 2.8.2 修复bug需要增加注释，解决了什么bug，bug原因，通过何种方式</h3><p>例如：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">*bug:焦点框位置不正确</span></span><br><span class="line"><span class="comment">*reason:计算错误</span></span><br><span class="line"><span class="comment">*solve:改为正确的计算方式</span></span><br><span class="line"><span class="comment">*author zhaokai</span></span><br><span class="line"><span class="comment">*date 2016-12-8</span></span><br><span class="line"><span class="comment">**/</span></span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-283-不可以出现注释仅仅是为了代码不运行如果是因为以后可能会用到而保留一定用注释说明否则请一定一律删掉" name="红-283-不可以出现注释仅仅是为了代码不运行如果是因为以后可能会用到而保留一定用注释说明否则请一定一律删掉"></a></p>
<h3 id="红-2-8-3-不可以出现注释仅仅是为了代码不运行，如果是因为以后可能会用到而保留，一定用注释说明，否则请一定一律删掉"><a href="#红-2-8-3-不可以出现注释仅仅是为了代码不运行，如果是因为以后可能会用到而保留，一定用注释说明，否则请一定一律删掉" class="headerlink" title="[红] 2.8.3 不可以出现注释仅仅是为了代码不运行，如果是因为以后可能会用到而保留，一定用注释说明，否则请一定一律删掉"></a>[红] 2.8.3 不可以出现注释仅仅是为了代码不运行，如果是因为以后可能会用到而保留，一定用注释说明，否则请一定一律删掉</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#x2F;*说明代码作用，为什么删掉，加上会有什么影响*&#x2F;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-29-其他" name="29-其他"></a></p>
<h2 id="2-9-其他"><a href="#2-9-其他" class="headerlink" title="2.9 其他"></a>2.9 其他</h2><p><a id="markdown-红-291-块缩进4个空格每当开始一个新的块缩进增加4个空格当块结束时缩进返回先前的缩进级别缩进级别适用于代码和注释" name="红-291-块缩进4个空格每当开始一个新的块缩进增加4个空格当块结束时缩进返回先前的缩进级别缩进级别适用于代码和注释"></a></p>
<h3 id="红-2-9-1-块缩进：4个空格，每当开始一个新的块，缩进增加4个空格，当块结束时，缩进返回先前的缩进级别。缩进级别适用于代码和注释"><a href="#红-2-9-1-块缩进：4个空格，每当开始一个新的块，缩进增加4个空格，当块结束时，缩进返回先前的缩进级别。缩进级别适用于代码和注释" class="headerlink" title="[红] 2.9.1 块缩进：4个空格，每当开始一个新的块，缩进增加4个空格，当块结束时，缩进返回先前的缩进级别。缩进级别适用于代码和注释"></a>[红] 2.9.1 块缩进：4个空格，每当开始一个新的块，缩进增加4个空格，当块结束时，缩进返回先前的缩进级别。缩进级别适用于代码和注释</h3><p><a id="markdown-红-292-一行一个语句每个语句后要换行" name="红-292-一行一个语句每个语句后要换行"></a></p>
<h3 id="红-2-9-2-一行一个语句，每个语句后要换行"><a href="#红-2-9-2-一行一个语句，每个语句后要换行" class="headerlink" title="[红] 2.9.2 一行一个语句，每个语句后要换行"></a>[红] 2.9.2 一行一个语句，每个语句后要换行</h3><p><a id="markdown-红-293-列限制80或100" name="红-293-列限制80或100"></a></p>
<h3 id="红-2-9-3-列限制：80或100"><a href="#红-2-9-3-列限制：80或100" class="headerlink" title="[红] 2.9.3 列限制：80或100"></a>[红] 2.9.3 列限制：80或100</h3><p>一个项目可以选择一行80个字符或100个字符的列限制，除了下述例外，任何一行如果超过这个字符数限制，必须自动换行。</p>
<p>例外：</p>
<ol>
<li>不可能满足列限制的行(例如，Javadoc中的一个长URL，或是一个长的JNI方法)。</li>
<li><code>package</code>和<code>import</code>语句(见3.2节和3.3节)。</li>
<li>注释中那些可能被剪切并粘贴到shell中的命令行。</li>
</ol>
<p><a id="markdown-红-294-自动换行" name="红-294-自动换行"></a></p>
<h3 id="红-2-9-4-自动换行"><a href="#红-2-9-4-自动换行" class="headerlink" title="[红] 2.9.4 自动换行"></a>[红] 2.9.4 自动换行</h3><p><strong>术语说明</strong>：一般情况下，一行长代码为了避免超出列限制(80或100个字符)而被分为多行，我们称之为自动换行(line-wrapping)。</p>
<p>我们并没有全面，确定性的准则来决定在每一种情况下如何自动换行。很多时候，对于同一段代码会有好几种有效的自动换行方式。</p>
<blockquote>
<p>Tip: 提取方法或局部变量可以在不换行的情况下解决代码过长的问题(是合理缩短命名长度吧)</p>
</blockquote>
<p><a id="markdown-红-295-自动换行的基本准则是更倾向于在更高的语法级别处断开" name="红-295-自动换行的基本准则是更倾向于在更高的语法级别处断开"></a></p>
<h3 id="红-2-9-5-自动换行的基本准则是：更倾向于在更高的语法级别处断开"><a href="#红-2-9-5-自动换行的基本准则是：更倾向于在更高的语法级别处断开" class="headerlink" title="[红] 2.9.5 自动换行的基本准则是：更倾向于在更高的语法级别处断开"></a>[红] 2.9.5 自动换行的基本准则是：更倾向于在更高的语法级别处断开</h3><ol>
<li>如果在<code>非赋值运算符</code>处断开，那么在该符号前断开(比如+，它将位于下一行)。注意：这一点与Google其它语言的编程风格不同(如C++和JavaScript)。 这条规则也适用于以下“类运算符”符号：点分隔符(.)，类型界限中的&amp;（<code>&lt;T extends Foo &amp; Bar&gt;</code>)，catch块中的管道符号(<code>catch (FooException | BarException e</code>)</li>
<li>如果在<code>赋值运算符</code>处断开，通常的做法是在该符号后断开(比如=，它与前面的内容留在同一行)。这条规则也适用于<code>foreach</code>语句中的分号。</li>
<li>方法名或构造函数名与左括号留在同一行。</li>
<li>逗号(<code>,</code>)与其前面的内容留在同一行。</li>
</ol>
<p><a id="markdown-红-296-自动换行时缩进4个空格" name="红-296-自动换行时缩进4个空格"></a></p>
<h3 id="红-2-9-6-自动换行时缩进4个空格"><a href="#红-2-9-6-自动换行时缩进4个空格" class="headerlink" title="[红] 2.9.6 自动换行时缩进4个空格"></a>[红] 2.9.6 自动换行时缩进<code>4</code>个空格</h3><p>自动换行时，第一行后的每一行至少比第一行多缩进4个空格。<br>当存在连续自动换行时，缩进可能会多缩进不只4个空格(语法元素存在多级时)。一般而言，两个连续行使用相同的缩进当且仅当它们开始于同级语法元素。</p>
<p><a id="markdown-红-297-modifiers" name="红-297-modifiers"></a></p>
<h3 id="红-2-9-7-Modifiers"><a href="#红-2-9-7-Modifiers" class="headerlink" title="[红] 2.9.7 Modifiers"></a>[红] 2.9.7 Modifiers</h3><p>类和成员的modifiers如果存在，则按Java语言规范中推荐的顺序出现。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">protected</span> <span class="keyword">private</span> <span class="keyword">abstract</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">transient</span> <span class="keyword">volatile</span> <span class="keyword">synchronized</span> <span class="keyword">native</span> <span class="keyword">strictfp</span></span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-298-不要在switch中嵌套switch" name="红-298-不要在switch中嵌套switch"></a></p>
<h3 id="红-2-9-8-不要在switch中嵌套switch"><a href="#红-2-9-8-不要在switch中嵌套switch" class="headerlink" title="[红] 2.9.8 不要在switch中嵌套switch"></a>[红] 2.9.8 不要在switch中嵌套switch</h3><p><a id="markdown-3-命名约定" name="3-命名约定"></a></p>
<h1 id="3-命名约定"><a href="#3-命名约定" class="headerlink" title="3. 命名约定"></a>3. 命名约定</h1><p><a id="markdown-31-android" name="31-android"></a></p>
<h2 id="3-1-Android"><a href="#3-1-Android" class="headerlink" title="3.1 Android"></a>3.1 Android</h2><p><a id="markdown-红-311-控件以功能控件命名" name="红-311-控件以功能控件命名"></a></p>
<h3 id="红-3-1-1-控件以功能-控件命名"><a href="#红-3-1-1-控件以功能-控件命名" class="headerlink" title="[红] 3.1.1 控件以功能+控件命名"></a>[红] 3.1.1 控件以功能+控件命名</h3><p>如：passwordEditText,loginButton等<br>在资源文件中的id和控件命名要一致</p>
<p><a id="markdown-红-312-布局文件命名" name="红-312-布局文件命名"></a></p>
<h3 id="红-3-1-2-布局文件命名"><a href="#红-3-1-2-布局文件命名" class="headerlink" title="[红] 3.1.2 布局文件命名"></a>[红] 3.1.2 布局文件命名</h3><ol>
<li>布局文件分为以下几种类型<ul>
<li>activity统一前缀为activity，例如activity_fti</li>
<li>dialog统一前缀为dialog，例如 dialog_password</li>
<li>fragment 统一前缀为fragment，例如fragment_login</li>
<li>layout统一前缀为layout，用于自定义控件， 例如，layout_custom_picker</li>
<li>item统一前缀为item，用于adapter view，例如，item_input_method</li>
<li>view统一前缀为layout</li>
</ul>
</li>
<li>其中布局文件和Java类一一对应，Java类的命名为布局文件命名的反序，如 FTIActivity，PasswordDialog，LoginFragment，CustomPicker，InputMethodItem等，请严格按照此规范命名，节省代码维护的查找时间。</li>
</ol>
<p><a id="markdown-红-313-资源文件命名" name="红-313-资源文件命名"></a></p>
<h3 id="红-3-1-3-资源文件命名"><a href="#红-3-1-3-资源文件命名" class="headerlink" title="[红] 3.1.3 资源文件命名"></a>[红] 3.1.3 资源文件命名</h3><ol>
<li>以UI组定义为准，只能以字母数字下划线为标识符，不能有空格，不能以数字开头。</li>
<li>colors定义不可以因为颜色值相同而用统一的命名，应该以模块划分，比如不能再某个背景中用R.color.text_light,这样可读性变差</li>
</ol>
<p><a id="markdown-红-314-接口命名" name="红-314-接口命名"></a></p>
<h3 id="红-3-1-4-接口命名"><a href="#红-3-1-4-接口命名" class="headerlink" title="[红] 3.1.4 接口命名"></a>[红] 3.1.4 接口命名</h3><p>接口命名以I开头，表示抽象层接口。回掉接口以On开头，表示特定事件发生时刻进行回调。例如IMenuItem,OnItemClickListener等。所有的接口需要进行javadoc的说明，表示接口定义的作用。以及抽象的含义。</p>
<p><a id="markdown-32-java" name="32-java"></a></p>
<h2 id="3-2-Java"><a href="#3-2-Java" class="headerlink" title="3.2 Java"></a>3.2 Java</h2><p><a id="markdown-红-321-包名全部小写连续的单词只是简单地连接起来不使用下划线" name="红-321-包名全部小写连续的单词只是简单地连接起来不使用下划线"></a></p>
<h3 id="红-3-2-1-包名全部小写，连续的单词只是简单地连接起来，不使用下划线"><a href="#红-3-2-1-包名全部小写，连续的单词只是简单地连接起来，不使用下划线" class="headerlink" title="[红] 3.2.1 包名全部小写，连续的单词只是简单地连接起来，不使用下划线"></a>[红] 3.2.1 包名全部小写，连续的单词只是简单地连接起来，不使用下划线</h3><p><a id="markdown-红-322-类名都以uppercamelcase风格编写" name="红-322-类名都以uppercamelcase风格编写"></a></p>
<h3 id="红-3-2-2-类名都以UpperCamelCase风格编写"><a href="#红-3-2-2-类名都以UpperCamelCase风格编写" class="headerlink" title="[红] 3.2.2 类名都以UpperCamelCase风格编写"></a>[红] 3.2.2 类名都以<code>UpperCamelCase</code>风格编写</h3><p>类名通常是名词或名词短语，接口名称有时可能是形容词或形容词短语。现在还没有特定的规则或行之有效的约定来命名注解类型。</p>
<p><em>特别注意</em>：测试类的命名以它要测试的类的名称开始，以<code>Test</code>结束。例如，<code>HashTest</code>或<code>HashIntegrationTest</code></p>
<p><a id="markdown-红-323-方法名都以lowercamelcase风格编写" name="红-323-方法名都以lowercamelcase风格编写"></a></p>
<h3 id="红-3-2-3-方法名都以lowerCamelCase风格编写"><a href="#红-3-2-3-方法名都以lowerCamelCase风格编写" class="headerlink" title="[红] 3.2.3 方法名都以lowerCamelCase风格编写"></a>[红] 3.2.3 方法名都以<code>lowerCamelCase</code>风格编写</h3><p>方法名通常是动词或动词短语。</p>
<p><a id="markdown-黄-324-方法命名约定" name="黄-324-方法命名约定"></a></p>
<h3 id="黄-3-2-4-方法命名约定："><a href="#黄-3-2-4-方法命名约定：" class="headerlink" title="[黄] 3.2.4 方法命名约定："></a>[黄] 3.2.4 方法命名约定：</h3><ul>
<li>initXX() 初始化相关方法,使用init为前缀标识，如初始化布局initView()</li>
<li>isXX()方法返回值为boolean型的请使用is为前缀标识</li>
<li>getXX()返回某个值的方法，使用get为前缀标识</li>
<li>setXX() 设置某个值的方法，使用set为前缀标识</li>
<li>resetXX() 重置某个值为默认值的方法，使用reset为前缀标识</li>
<li>handleXX() 对数据进行处理的方法，尽量使用handle为前缀标识</li>
<li>showXX() 弹出提示框和提示信息，使用show为前缀标识</li>
<li>saveXX() 与保存数据相关的，使用save为前缀标识</li>
<li>restoreXX() 对数据重组的，使用reset前缀标识</li>
<li>clearXX() 清除数据相关的</li>
<li>removeXXX() 清除数据相关的</li>
<li>drawXXX() 绘制数据或效果相关的，使用draw前缀标识</li>
</ul>
<p><a id="markdown-红-325-常量名命名模式为constant_case全部字母大写用下划线分隔单词" name="红-325-常量名命名模式为constant_case全部字母大写用下划线分隔单词"></a></p>
<h3 id="红-3-2-5-常量名命名模式为CONSTANT-CASE，全部字母大写，用下划线分隔单词"><a href="#红-3-2-5-常量名命名模式为CONSTANT-CASE，全部字母大写，用下划线分隔单词" class="headerlink" title="[红] 3.2.5 常量名命名模式为CONSTANT_CASE，全部字母大写，用下划线分隔单词"></a>[红] 3.2.5 常量名命名模式为<code>CONSTANT_CASE</code>，全部字母大写，用下划线分隔单词</h3><p>那，到底什么算是一个常量？<br>每个常量都是一个静态final字段，但不是所有静态final字段都是常量。在决定一个字段是否是一个常量时， 考虑它是否真的感觉像是一个常量。例如，如果任何一个该实例的观测状态是可变的，则它几乎肯定不会是一个常量。 只是永远不<code>打算</code>改变对象一般是不够的，它要真的一直不变才能将它示为常量。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Constants</span></span><br><span class="line"><span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> NUMBER = <span class="number">5</span>;</span><br><span class="line"><span class="keyword">static</span> <span class="keyword">final</span> ImmutableList&lt;String&gt; NAMES = ImmutableList.of(<span class="string">&quot;Ed&quot;</span>, <span class="string">&quot;Ann&quot;</span>);</span><br><span class="line"><span class="keyword">static</span> <span class="keyword">final</span> Joiner COMMA_JOINER = Joiner.on(<span class="string">&#x27;,&#x27;</span>);  <span class="comment">// because Joiner is immutable</span></span><br><span class="line"><span class="keyword">static</span> <span class="keyword">final</span> SomeMutableType[] EMPTY_ARRAY = &#123;&#125;;</span><br><span class="line"><span class="class"><span class="keyword">enum</span> <span class="title">SomeEnum</span> </span>&#123; ENUM_CONSTANT &#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Not constants</span></span><br><span class="line"><span class="keyword">static</span> String nonFinal = <span class="string">&quot;non-final&quot;</span>;</span><br><span class="line"><span class="keyword">final</span> String nonStatic = <span class="string">&quot;non-static&quot;</span>;</span><br><span class="line"><span class="keyword">static</span> <span class="keyword">final</span> Set&lt;String&gt; mutableCollection = <span class="keyword">new</span> HashSet&lt;String&gt;();</span><br><span class="line"><span class="keyword">static</span> <span class="keyword">final</span> ImmutableSet&lt;SomeMutableType&gt; mutableElements = ImmutableSet.of(mutable);</span><br><span class="line"><span class="keyword">static</span> <span class="keyword">final</span> Logger logger = Logger.getLogger(MyClass.getName());</span><br><span class="line"><span class="keyword">static</span> <span class="keyword">final</span> String[] nonEmptyArray = &#123;<span class="string">&quot;these&quot;</span>, <span class="string">&quot;can&quot;</span>, <span class="string">&quot;change&quot;</span>&#125;;</span><br></pre></td></tr></table></figure>
<p>这些名字通常是名词或名词短语。</p>
<p><a id="markdown-红-326-非常量字段名以lowercamelcase风格编写" name="红-326-非常量字段名以lowercamelcase风格编写"></a></p>
<h3 id="红-3-2-6-非常量字段名以lowerCamelCase风格编写"><a href="#红-3-2-6-非常量字段名以lowerCamelCase风格编写" class="headerlink" title="[红] 3.2.6 非常量字段名以lowerCamelCase风格编写"></a>[红] 3.2.6 非常量字段名以<code>lowerCamelCase</code>风格编写</h3><p>这些名字通常是名词或名词短语。</p>
<p><a id="markdown-红-327-参数名以lowercamelcase风格编写" name="红-327-参数名以lowercamelcase风格编写"></a></p>
<h3 id="红-3-2-7-参数名以lowerCamelCase风格编写"><a href="#红-3-2-7-参数名以lowerCamelCase风格编写" class="headerlink" title="[红] 3.2.7 参数名以lowerCamelCase风格编写"></a>[红] 3.2.7 参数名以<code>lowerCamelCase</code>风格编写</h3><p>参数应该避免用单个字符命名。</p>
<p><a id="markdown-红-328-局部变量名以lowercamelcase风格编写" name="红-328-局部变量名以lowercamelcase风格编写"></a></p>
<h3 id="红-3-2-8-局部变量名以lowerCamelCase风格编写"><a href="#红-3-2-8-局部变量名以lowerCamelCase风格编写" class="headerlink" title="[红] 3.2.8 局部变量名以lowerCamelCase风格编写"></a>[红] 3.2.8 局部变量名以<code>lowerCamelCase</code>风格编写</h3><p>比起其它类型的名称，局部变量名可以有更为宽松的缩写。<br>虽然缩写更宽松，但还是要避免用单字符进行命名，除了临时变量和循环变量。<br>即使局部变量是final和不可改变的，也不应该把它示为常量，自然也不能用常量的规则去命名它。</p>
<p><a id="markdown-红-329-类型变量名" name="红-329-类型变量名"></a></p>
<h3 id="红-3-2-9-类型变量名"><a href="#红-3-2-9-类型变量名" class="headerlink" title="[红] 3.2.9 类型变量名"></a>[红] 3.2.9 类型变量名</h3><p>类型变量可用以下两种风格之一进行命名：</p>
<ul>
<li>单个的大写字母，后面可以跟一个数字(如：E, T, X, T2)。</li>
<li>以类命名方式(5.2.2节)，后面加个大写的T(如：RequestT, FooBarT)。</li>
</ul>
<blockquote>
<p><a target="_blank" rel="noopener" href="http://zh.wikipedia.org/wiki/%E9%A7%9D%E5%B3%B0%E5%BC%8F%E5%A4%A7%E5%B0%8F%E5%AF%AB">驼峰式命名法</a>(<code>CamelCase</code>)分大驼峰式命名法(<code>UpperCamelCase</code>)和小驼峰式命名法(<code>lowerCamelCase</code>)。 有时，我们有不只一种合理的方式将一个英语词组转换成驼峰形式，如缩略语或不寻常的结构(例如”IPv6”或”iOS”)。Google指定了以下的转换方案。<br>名字从<code>散文形式</code>(prose form)开始:</p>
<ol>
<li>把短语转换为纯ASCII码，并且移除任何单引号。例如：”Müller’s algorithm”将变成”Muellers algorithm”。</li>
<li>把这个结果切分成单词，在空格或其它标点符号(通常是连字符)处分割开。<ul>
<li>推荐：如果某个单词已经有了常用的驼峰表示形式，按它的组成将它分割开(如”AdWords”将分割成”ad words”)。 需要注意的是”iOS”并不是一个真正的驼峰表示形式，因此该推荐对它并不适用。</li>
</ul>
</li>
<li>现在将所有字母都小写(包括缩写)，然后将单词的第一个字母大写：<ul>
<li>每个单词的第一个字母都大写，来得到大驼峰式命名。</li>
<li>除了第一个单词，每个单词的第一个字母都大写，来得到小驼峰式命名。</li>
</ul>
</li>
<li>最后将所有的单词连接起来得到一个标识符。</li>
</ol>
</blockquote>
<blockquote>
<p>示例:<br>|Prose form|Correct|Incorrect|<br>|:——–:|:—–:|:——-:|<br>|”XML HTTP request”|XmlHttpRequest|XMLHTTPRequest|<br>|”new customer ID”|newCustomerId|newCustomerID|<br>|”inner stopwatch”|innerStopwatch|innerStopWatch|<br>|”supports IPv6 on iOS?”|supportsIpv6OnIos|supportsIPv6OnIOS|<br>|”YouTube importer”|YouTubeImporter||</p>
</blockquote>
<blockquote>
<p>Note：在英语中，某些带有连字符的单词形式不唯一。<br>例如：<code>nonempty</code>和<code>non-empty</code>都是正确的，因此方法名<code>checkNonempty</code>和<code>checkNonEmpty</code>也都是正确的。</p>
</blockquote>
<p><a id="markdown-红-3210-所有标识符命名必须英文不可以有拼音" name="红-3210-所有标识符命名必须英文不可以有拼音"></a></p>
<h3 id="红-3-2-10-所有标识符命名必须英文，不可以有拼音"><a href="#红-3-2-10-所有标识符命名必须英文，不可以有拼音" class="headerlink" title="[红] 3.2.10 所有标识符命名必须英文，不可以有拼音"></a>[红] 3.2.10 所有标识符命名必须英文，不可以有拼音</h3><p><a id="markdown-红-3211-不可以有无必要的缩写absclassimg等不允许出现" name="红-3211-不可以有无必要的缩写absclassimg等不允许出现"></a></p>
<h3 id="红-3-2-11-不可以有无必要的缩写AbsClass-Img等不允许出现"><a href="#红-3-2-11-不可以有无必要的缩写AbsClass-Img等不允许出现" class="headerlink" title="[红] 3.2.11 不可以有无必要的缩写AbsClass,Img等不允许出现"></a>[红] 3.2.11 不可以有无必要的缩写AbsClass,Img等不允许出现</h3><p><a id="markdown-红-3212-抽象类命名使用abstract或base开头异常类命名使用exception结尾测试类命名以它要测试的类的名称开始以test结尾" name="红-3212-抽象类命名使用abstract或base开头异常类命名使用exception结尾测试类命名以它要测试的类的名称开始以test结尾"></a></p>
<h3 id="红-3-2-12-抽象类命名使用Abstract或Base开头；异常类命名使用Exception结尾；测试类命名以它要测试的类的名称开始，以Test结尾"><a href="#红-3-2-12-抽象类命名使用Abstract或Base开头；异常类命名使用Exception结尾；测试类命名以它要测试的类的名称开始，以Test结尾" class="headerlink" title="[红] 3.2.12 抽象类命名使用Abstract或Base开头；异常类命名使用Exception结尾；测试类命名以它要测试的类的名称开始，以Test结尾"></a>[红] 3.2.12 抽象类命名使用Abstract或Base开头；异常类命名使用Exception结尾；测试类命名以它要测试的类的名称开始，以Test结尾</h3><p><a id="markdown-红-3213-如果使用了某种设计模式请务必在类名中体现" name="红-3213-如果使用了某种设计模式请务必在类名中体现"></a></p>
<h3 id="红-3-2-13-如果使用了某种设计模式，请务必在类名中体现"><a href="#红-3-2-13-如果使用了某种设计模式，请务必在类名中体现" class="headerlink" title="[红] 3.2.13 如果使用了某种设计模式，请务必在类名中体现"></a>[红] 3.2.13 如果使用了某种设计模式，请务必在类名中体现</h3><ul>
<li>工厂模式 XXXFactory</li>
<li>建造者模式 XXXBuilder</li>
<li>单例模式 XXXSingleton</li>
<li>适配器模式 XXXAdapter</li>
<li>代理模式 XXXProxy</li>
<li>观察者模式 XXXObserver</li>
<li>策略模式 XXXStrategy</li>
</ul>
<p>举例：<br>Android Framework中实现应用安装、删除就是用了观察者模式</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">PackageDeleteObserver</span><br><span class="line">PackageInstallObserver</span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-3214-接口类的方法要加注释说明并且不需要任何修饰词如public" name="红-3214-接口类的方法要加注释说明并且不需要任何修饰词如public"></a></p>
<h3 id="红-3-2-14-接口类的方法要加注释说明，并且不需要任何修饰词-如public"><a href="#红-3-2-14-接口类的方法要加注释说明，并且不需要任何修饰词-如public" class="headerlink" title="[红] 3.2.14 接口类的方法要加注释说明，并且不需要任何修饰词(如public)"></a>[红] 3.2.14 接口类的方法要加注释说明，并且不需要任何修饰词(如public)</h3><p>before:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">IView</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">void</span> <span class="title">draw</span><span class="params">()</span></span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>after:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">IView</span> </span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">    * draw the view</span></span><br><span class="line"><span class="comment">    **/</span></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">draw</span><span class="params">()</span></span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-黄-3215-enum-命名以enum开头且成员必须全大写" name="黄-3215-enum-命名以enum开头且成员必须全大写"></a></p>
<h3 id="黄-3-2-15-Enum-命名以Enum开头，且成员必须全大写"><a href="#黄-3-2-15-Enum-命名以Enum开头，且成员必须全大写" class="headerlink" title="[黄] 3.2.15 Enum 命名以Enum开头，且成员必须全大写"></a>[黄] 3.2.15 Enum 命名以Enum开头，且成员必须全大写</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">enum</span> <span class="title">EnumWeek</span></span>&#123;</span><br><span class="line">    SUNDAY,</span><br><span class="line">    MONDAY,</span><br><span class="line">    TUESDAY,</span><br><span class="line">    WEDNESDAY,</span><br><span class="line">    THURSDAY,</span><br><span class="line">    FRIDAY,</span><br><span class="line">    SATURDAY</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-4-编程实践" name="4-编程实践"></a></p>
<h1 id="4-编程实践"><a href="#4-编程实践" class="headerlink" title="4. 编程实践"></a>4. 编程实践</h1><p><a id="markdown-41-android" name="41-android"></a></p>
<h2 id="4-1-Android"><a href="#4-1-Android" class="headerlink" title="4.1 Android"></a>4.1 Android</h2><p><a id="markdown-红-411-如果能通过xml描述解决的drawable不用使用ui切图不论是效率还是扩展性xml描述的drawable远比用切图好很多" name="红-411-如果能通过xml描述解决的drawable不用使用ui切图不论是效率还是扩展性xml描述的drawable远比用切图好很多"></a></p>
<h3 id="红-4-1-1-如果能通过xml描述解决的drawable，不用使用UI切图，不论是效率还是扩展性，xml描述的drawable远比用切图好很多"><a href="#红-4-1-1-如果能通过xml描述解决的drawable，不用使用UI切图，不论是效率还是扩展性，xml描述的drawable远比用切图好很多" class="headerlink" title="[红] 4.1.1 如果能通过xml描述解决的drawable，不用使用UI切图，不论是效率还是扩展性，xml描述的drawable远比用切图好很多"></a>[红] 4.1.1 如果能通过xml描述解决的drawable，不用使用UI切图，不论是效率还是扩展性，xml描述的drawable远比用切图好很多</h3><p><a id="markdown-红-412-使用adapterview的子类和adapter时实现getview时要是用convertview而不是每次都重新构建view" name="红-412-使用adapterview的子类和adapter时实现getview时要是用convertview而不是每次都重新构建view"></a></p>
<h3 id="红-4-1-2-使用AdapterView的子类和Adapter时，实现getView时，要是用convertView，而不是每次都重新构建View"><a href="#红-4-1-2-使用AdapterView的子类和Adapter时，实现getView时，要是用convertView，而不是每次都重新构建View" class="headerlink" title="[红] 4.1.2 使用AdapterView的子类和Adapter时，实现getView时，要是用convertView，而不是每次都重新构建View"></a>[红] 4.1.2 使用AdapterView的子类和Adapter时，实现getView时，要是用convertView，而不是每次都重新构建View</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> View <span class="title">getView</span><span class="params">(<span class="keyword">int</span> position, View convertView, ViewGroup parent)</span> </span>&#123; <span class="comment">//Bad</span></span><br><span class="line">    View item = mInflater.inflate(R.layout.list_item_icon_text, <span class="keyword">null</span>);</span><br><span class="line">    ((TextView) item.findViewById(R.id.text)).setText(DATA[position]);</span><br><span class="line">    ((ImageView) item.findViewById(R.id.icon)).setImageBitmap((position &amp; <span class="number">1</span>) == <span class="number">1</span> ? mIcon1 : mIcon2);</span><br><span class="line">    <span class="keyword">return</span> item;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> View <span class="title">getView</span><span class="params">(<span class="keyword">int</span> position, View convertView, ViewGroup parent)</span> </span>&#123; <span class="comment">//Good</span></span><br><span class="line">    <span class="keyword">if</span> (convertView == <span class="keyword">null</span>) &#123;</span><br><span class="line">        convertView = mInflater.inflate(R.layout.item, parent, <span class="keyword">false</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);</span><br><span class="line">    ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap((position &amp; <span class="number">1</span>) == <span class="number">1</span> ? mIcon1 : mIcon2);</span><br><span class="line">    <span class="keyword">return</span> convertView;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-黄-413-设计ui时要注意避免过度绘制不能出现同一个区域2倍以上的过度绘制" name="黄-413-设计ui时要注意避免过度绘制不能出现同一个区域2倍以上的过度绘制"></a></p>
<h3 id="黄-4-1-3-设计UI时要注意避免过度绘制，不能出现同一个区域2倍以上的过度绘制"><a href="#黄-4-1-3-设计UI时要注意避免过度绘制，不能出现同一个区域2倍以上的过度绘制" class="headerlink" title="[黄] 4.1.3 设计UI时要注意避免过度绘制，不能出现同一个区域2倍以上的过度绘制"></a>[黄] 4.1.3 设计UI时要注意避免过度绘制，不能出现同一个区域2倍以上的过度绘制</h3><p>使用开发中选项中的过度绘制检测功能调试，开启后，系统在进行应用渲染会针对各区域应用过度绘制的程度不同显示不同颜色：</p>
<ul>
<li><strong>本色</strong>：<code>没有发生过度绘制</code>，屏幕上的像素点只被绘制了<strong>1</strong>次</li>
<li><strong>蓝色</strong>：<code>1 倍过度绘制</code>，屏幕上的像素点被绘制了<strong>2</strong>次</li>
<li><strong>绿色</strong>：<code>2 倍过度绘制</code>，屏幕上的像素点被绘制了<strong>3</strong>次</li>
<li><strong>粉色</strong>：<code>3 倍过度绘制</code>，屏幕上的像素点被绘制了<strong>4</strong>次</li>
<li><strong>红色</strong>：<code>4 倍过度绘制</code>，屏幕上的像素点被绘制了<strong>5</strong>次</li>
</ul>
<p><a id="markdown-红-414-日志规范" name="红-414-日志规范"></a></p>
<h3 id="红-4-1-4-日志规范"><a href="#红-4-1-4-日志规范" class="headerlink" title="[红] 4.1.4 日志规范"></a>[红] 4.1.4 日志规范</h3><ul>
<li>要使用当前类名做TAG</li>
<li>调试Log要加开关控制，发布版本不能有调试Log</li>
<li>Log信息要有意义，不能出现类似<code>111</code>，<code>222</code>这样的Log信息</li>
</ul>
<p><a id="markdown-红-415-属性使用规范" name="红-415-属性使用规范"></a></p>
<h3 id="红-4-1-5-属性使用规范"><a href="#红-4-1-5-属性使用规范" class="headerlink" title="[红] 4.1.5 属性使用规范"></a>[红] 4.1.5 属性使用规范</h3><ul>
<li>只读属性用静态常量存储在一个属性公共类中</li>
<li>可读写的属性要实时获取，保证属性值的正确性</li>
<li>不要直接使用或反射使用SystemProperties类读写属性，导致SDK编译困难</li>
<li>通过TV API读写系统属性</li>
</ul>
<p><a id="markdown-黄-416-需要使用列表样式的ui时优先使用recyclerview而不是listview" name="黄-416-需要使用列表样式的ui时优先使用recyclerview而不是listview"></a></p>
<h3 id="黄-4-1-6-需要使用列表样式的UI时优先使用RecyclerView，而不是ListView"><a href="#黄-4-1-6-需要使用列表样式的UI时优先使用RecyclerView，而不是ListView" class="headerlink" title="[黄] 4.1.6 需要使用列表样式的UI时优先使用RecyclerView，而不是ListView"></a>[黄] 4.1.6 需要使用列表样式的UI时优先使用RecyclerView，而不是ListView</h3><p><a id="markdown-42-集合" name="42-集合"></a></p>
<h2 id="4-2-集合"><a href="#4-2-集合" class="headerlink" title="4.2 集合"></a>4.2 集合</h2><p><a id="markdown-黄-421-mapset的key为自定义对象时必须重写hashcode和equals" name="黄-421-mapset的key为自定义对象时必须重写hashcode和equals"></a></p>
<h3 id="黄-4-2-1-Map-Set的key为自定义对象时，必须重写hashCode和equals"><a href="#黄-4-2-1-Map-Set的key为自定义对象时，必须重写hashCode和equals" class="headerlink" title="[黄] 4.2.1 Map/Set的key为自定义对象时，必须重写hashCode和equals"></a>[黄] 4.2.1 Map/Set的key为自定义对象时，必须重写hashCode和equals</h3><p><a id="markdown-黄-422-arraylist的sublist结果不可强转成arraylist否则会抛出classcastexception异常" name="黄-422-arraylist的sublist结果不可强转成arraylist否则会抛出classcastexception异常"></a></p>
<h3 id="黄-4-2-2-ArrayList的subList结果不可强转成ArrayList，否则会抛出ClassCastException异常"><a href="#黄-4-2-2-ArrayList的subList结果不可强转成ArrayList，否则会抛出ClassCastException异常" class="headerlink" title="[黄] 4.2.2 ArrayList的subList结果不可强转成ArrayList，否则会抛出ClassCastException异常"></a>[黄] 4.2.2 ArrayList的subList结果不可强转成ArrayList，否则会抛出ClassCastException异常</h3><p><a id="markdown-黄-423-在sublist场景中高度注意对原集合元素个数的修改会导致子列表的遍历增加删除均产生concurrentmodificationexception异常" name="黄-423-在sublist场景中高度注意对原集合元素个数的修改会导致子列表的遍历增加删除均产生concurrentmodificationexception异常"></a></p>
<h3 id="黄-4-2-3-在subList场景中，高度注意对原集合元素个数的修改，会导致子列表的遍历、增加、删除均产生ConcurrentModificationException异常"><a href="#黄-4-2-3-在subList场景中，高度注意对原集合元素个数的修改，会导致子列表的遍历、增加、删除均产生ConcurrentModificationException异常" class="headerlink" title="[黄] 4.2.3 在subList场景中，高度注意对原集合元素个数的修改，会导致子列表的遍历、增加、删除均产生ConcurrentModificationException异常"></a>[黄] 4.2.3 在subList场景中，高度注意对原集合元素个数的修改，会导致子列表的遍历、增加、删除均产生ConcurrentModificationException异常</h3><p><a id="markdown-黄-424-使用集合转数组的方法必须使用集合的toarrayt-array传入的是类型完全一样的数组大小就是listsize" name="黄-424-使用集合转数组的方法必须使用集合的toarrayt-array传入的是类型完全一样的数组大小就是listsize"></a></p>
<h3 id="黄-4-2-4-使用集合转数组的方法，必须使用集合的toArray-T-array-，传入的是类型完全一样的数组，大小就是list-size"><a href="#黄-4-2-4-使用集合转数组的方法，必须使用集合的toArray-T-array-，传入的是类型完全一样的数组，大小就是list-size" class="headerlink" title="[黄] 4.2.4 使用集合转数组的方法，必须使用集合的toArray(T[] array)，传入的是类型完全一样的数组，大小就是list.size()"></a>[黄] 4.2.4 使用集合转数组的方法，必须使用集合的toArray(T[] array)，传入的是类型完全一样的数组，大小就是list.size()</h3><p><a id="markdown-黄-425-使用工具类arraysaslist把数组转换成集合时不能使用其修改集合相关的方法它的addremoveclear方法会抛出unsupportedoperationexception异常" name="黄-425-使用工具类arraysaslist把数组转换成集合时不能使用其修改集合相关的方法它的addremoveclear方法会抛出unsupportedoperationexception异常"></a></p>
<h3 id="黄-4-2-5-使用工具类Arrays-asList-把数组转换成集合时，不能使用其修改集合相关的方法，它的add-remove-clear方法会抛出UnsupportedOperationException异常"><a href="#黄-4-2-5-使用工具类Arrays-asList-把数组转换成集合时，不能使用其修改集合相关的方法，它的add-remove-clear方法会抛出UnsupportedOperationException异常" class="headerlink" title="[黄] 4.2.5 使用工具类Arrays.asList()把数组转换成集合时，不能使用其修改集合相关的方法，它的add/remove/clear方法会抛出UnsupportedOperationException异常"></a>[黄] 4.2.5 使用工具类Arrays.asList()把数组转换成集合时，不能使用其修改集合相关的方法，它的add/remove/clear方法会抛出UnsupportedOperationException异常</h3><p><a id="markdown-黄-426-不要在foreach循环里进行元素的removeadd操作remove元素请使用iterator-方式如果并发操作需要对iterator对象加锁" name="黄-426-不要在foreach循环里进行元素的removeadd操作remove元素请使用iterator-方式如果并发操作需要对iterator对象加锁"></a></p>
<h3 id="黄-4-2-6-不要在foreach循环里进行元素的remove-add操作。remove元素请使用Iterator-方式，如果并发操作，需要对Iterator对象加锁"><a href="#黄-4-2-6-不要在foreach循环里进行元素的remove-add操作。remove元素请使用Iterator-方式，如果并发操作，需要对Iterator对象加锁" class="headerlink" title="[黄] 4.2.6 不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator 方式，如果并发操作，需要对Iterator对象加锁"></a>[黄] 4.2.6 不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator 方式，如果并发操作，需要对Iterator对象加锁</h3><p><a id="markdown-黄-427-使用entryset遍历map类集合kv而不是keyset方式进行遍历" name="黄-427-使用entryset遍历map类集合kv而不是keyset方式进行遍历"></a></p>
<h3 id="黄-4-2-7-使用entrySet遍历Map类集合KV，而不是keySet方式进行遍历"><a href="#黄-4-2-7-使用entrySet遍历Map类集合KV，而不是keySet方式进行遍历" class="headerlink" title="[黄] 4.2.7 使用entrySet遍历Map类集合KV，而不是keySet方式进行遍历"></a>[黄] 4.2.7 使用entrySet遍历Map类集合KV，而不是keySet方式进行遍历</h3><p><a id="markdown-43-并发" name="43-并发"></a></p>
<h2 id="4-3-并发"><a href="#4-3-并发" class="headerlink" title="4.3 并发"></a>4.3 并发</h2><p><a id="markdown-红-431-线程资源必须通过线程池提供不允许在应用中自行显式创建线程参考代码" name="红-431-线程资源必须通过线程池提供不允许在应用中自行显式创建线程参考代码"></a></p>
<h3 id="红-4-3-1-线程资源必须通过线程池提供，不允许在应用中自行显式创建线程，参考代码："><a href="#红-4-3-1-线程资源必须通过线程池提供，不允许在应用中自行显式创建线程，参考代码：" class="headerlink" title="[红] 4.3.1 线程资源必须通过线程池提供，不允许在应用中自行显式创建线程，参考代码："></a>[红] 4.3.1 线程资源必须通过线程池提供，不允许在应用中自行显式创建线程，参考代码：</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">ExecutorService cachedThreadPool = Executors.newCachedThreadPool();</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">10</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">final</span> <span class="keyword">int</span> index = i;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        Thread.sleep(index * <span class="number">1000</span>);</span><br><span class="line">	&#125; <span class="keyword">catch</span> (InterruptedException e) &#123;</span><br><span class="line">        e.printStackTrace();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    cachedThreadPool.execute(<span class="keyword">new</span> Runnable() &#123;</span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span> </span>&#123;</span><br><span class="line">            System.out.println(index);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p><a target="_blank" rel="noopener" href="http://www.trinea.cn/android/java-android-thread-pool/">Java(Android)线程池</a></p>
<p><a id="markdown-红-432-simpledateformat-是线程不安全的类一般不要定义为static变量如果定义为-static必须加锁或者使用dateutils工具类" name="红-432-simpledateformat-是线程不安全的类一般不要定义为static变量如果定义为-static必须加锁或者使用dateutils工具类"></a></p>
<h3 id="红-4-3-2-SimpleDateFormat-是线程不安全的类，一般不要定义为static变量，如果定义为-static，必须加锁，或者使用DateUtils工具类"><a href="#红-4-3-2-SimpleDateFormat-是线程不安全的类，一般不要定义为static变量，如果定义为-static，必须加锁，或者使用DateUtils工具类" class="headerlink" title="[红] 4.3.2 SimpleDateFormat 是线程不安全的类，一般不要定义为static变量，如果定义为 static，必须加锁，或者使用DateUtils工具类"></a>[红] 4.3.2 SimpleDateFormat 是线程不安全的类，一般不要定义为static变量，如果定义为 static，必须加锁，或者使用DateUtils工具类</h3><p><a id="markdown-红-433-同步调用应该去考量锁的性能损耗能用无锁数据结构就不要用锁能锁区块就不要锁整个方法体能用对象锁就不要用类锁" name="红-433-同步调用应该去考量锁的性能损耗能用无锁数据结构就不要用锁能锁区块就不要锁整个方法体能用对象锁就不要用类锁"></a></p>
<h3 id="红-4-3-3-同步调用应该去考量锁的性能损耗。能用无锁数据结构，就不要用锁；能锁区块，就不要锁整个方法体；能用对象锁，就不要用类锁"><a href="#红-4-3-3-同步调用应该去考量锁的性能损耗。能用无锁数据结构，就不要用锁；能锁区块，就不要锁整个方法体；能用对象锁，就不要用类锁" class="headerlink" title="[红] 4.3.3 同步调用应该去考量锁的性能损耗。能用无锁数据结构，就不要用锁；能锁区块，就不要锁整个方法体；能用对象锁，就不要用类锁"></a>[红] 4.3.3 同步调用应该去考量锁的性能损耗。能用无锁数据结构，就不要用锁；能锁区块，就不要锁整个方法体；能用对象锁，就不要用类锁</h3><p><a id="markdown-红-434-对多个资源数据库表对象同时加锁时需要保持一致的加锁顺序否则可能会造成死锁" name="红-434-对多个资源数据库表对象同时加锁时需要保持一致的加锁顺序否则可能会造成死锁"></a></p>
<h3 id="红-4-3-4-对多个资源、数据库表、对象同时加锁时，需要保持一致的加锁顺序，否则可能会造成死锁"><a href="#红-4-3-4-对多个资源、数据库表、对象同时加锁时，需要保持一致的加锁顺序，否则可能会造成死锁" class="headerlink" title="[红] 4.3.4 对多个资源、数据库表、对象同时加锁时，需要保持一致的加锁顺序，否则可能会造成死锁"></a>[红] 4.3.4 对多个资源、数据库表、对象同时加锁时，需要保持一致的加锁顺序，否则可能会造成死锁</h3><p><a id="markdown-红-435-需要使用定时器时使用scheduledexecutorservice执行定时任务而不是使用timer范例" name="红-435-需要使用定时器时使用scheduledexecutorservice执行定时任务而不是使用timer范例"></a></p>
<h3 id="红-4-3-5-需要使用定时器时，使用ScheduledExecutorService执行定时任务，而不是使用Timer。范例："><a href="#红-4-3-5-需要使用定时器时，使用ScheduledExecutorService执行定时任务，而不是使用Timer。范例：" class="headerlink" title="[红] 4.3.5 需要使用定时器时，使用ScheduledExecutorService执行定时任务，而不是使用Timer。范例："></a>[红] 4.3.5 需要使用定时器时，使用ScheduledExecutorService执行定时任务，而不是使用Timer。范例：</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(<span class="number">5</span>);</span><br><span class="line">scheduledThreadPool.schedule(<span class="keyword">new</span> Runnable() &#123;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;delay 3 seconds&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;, <span class="number">3</span>, TimeUnit.SECONDS);</span><br></pre></td></tr></table></figure>
<p>参考资料：<br><a target="_blank" rel="noopener" href="http://jimwayne.blogspot.com/2011/11/java-1.html">Java定时执行</a><br><a target="_blank" rel="noopener" href="https://stackoverflow.com/questions/409932/java-timer-vs-executorservice">Java Timer vs ExecutorService?</a><br><a target="_blank" rel="noopener" href="http://blog.csdn.net/lmj623565791/article/details/27109467">Java 并发专题 ： Timer的缺陷 用ScheduledExecutorService替代</a><br><a target="_blank" rel="noopener" href="http://blog.csdn.net/lzqjfly/article/details/8021551">Java Timer计时器在android中运行时出现的问题</a></p>
<p><a id="markdown-44-类" name="44-类"></a></p>
<h2 id="4-4-类"><a href="#4-4-类" class="headerlink" title="4.4 类"></a>4.4 类</h2><p><a id="markdown-红-441-只有一个顶级类声明每个顶级类都在一个与它同名的源文件中当然还包含java后缀" name="红-441-只有一个顶级类声明每个顶级类都在一个与它同名的源文件中当然还包含java后缀"></a></p>
<h3 id="红-4-4-1-只有一个顶级类声明，每个顶级类都在一个与它同名的源文件中-当然，还包含-java后缀-。"><a href="#红-4-4-1-只有一个顶级类声明，每个顶级类都在一个与它同名的源文件中-当然，还包含-java后缀-。" class="headerlink" title="[红] 4.4.1 只有一个顶级类声明，每个顶级类都在一个与它同名的源文件中(当然，还包含.java后缀)。"></a>[红] 4.4.1 只有一个顶级类声明，每个顶级类都在一个与它同名的源文件中(当然，还包含<code>.java</code>后缀)。</h3><p><a id="markdown-红-442-所有重写的方法必须加上override的注解" name="红-442-所有重写的方法必须加上override的注解"></a></p>
<h3 id="红-4-4-2-所有重写的方法必须加上-Override的注解"><a href="#红-4-4-2-所有重写的方法必须加上-Override的注解" class="headerlink" title="[红] 4.4.2 所有重写的方法必须加上@Override的注解"></a>[红] 4.4.2 所有重写的方法必须加上@Override的注解</h3><p><a id="markdown-红-443-类成员顺序要做到public的成员在前protected和private的成员依次排在后面" name="红-443-类成员顺序要做到public的成员在前protected和private的成员依次排在后面"></a></p>
<h3 id="红-4-4-3-类成员顺序要做到public的成员在前，protected和private的成员依次排在后面"><a href="#红-4-4-3-类成员顺序要做到public的成员在前，protected和private的成员依次排在后面" class="headerlink" title="[红] 4.4.3 类成员顺序要做到public的成员在前，protected和private的成员依次排在后面"></a>[红] 4.4.3 类成员顺序要做到public的成员在前，protected和private的成员依次排在后面</h3><p><a id="markdown-黄-444-类成员与方法访问控制从严" name="黄-444-类成员与方法访问控制从严"></a></p>
<h3 id="黄-4-4-4-类成员与方法访问控制从严"><a href="#黄-4-4-4-类成员与方法访问控制从严" class="headerlink" title="[黄] 4.4.4 类成员与方法访问控制从严"></a>[黄] 4.4.4 类成员与方法访问控制从严</h3><ol>
<li>如果不允许外部直接通过new来创建对象，那么构造方法必须是private</li>
<li>工具类不允许有public或default构造方法</li>
<li>类非static成员变量并且与子类共享，必须是protected</li>
<li>类非static成员变量并且仅在本类使用，必须是private</li>
<li>类static成员变量如果仅在本类使用，必须是private</li>
<li>若是static成员变量，必须考虑是否为final</li>
<li>类成员方法只供类内部调用，必须是private</li>
<li>类成员方法只对继承类公开，那么限制为protected</li>
</ol>
<p><a id="markdown-红-445-当一个类有多个构造函数或是多个同名方法这些函数方法应该按顺序出现在一起中间不要放进其它函数方法" name="红-445-当一个类有多个构造函数或是多个同名方法这些函数方法应该按顺序出现在一起中间不要放进其它函数方法"></a></p>
<h3 id="红-4-4-5-当一个类有多个构造函数，或是多个同名方法，这些函数-方法应该按顺序出现在一起，中间不要放进其它函数-方法。"><a href="#红-4-4-5-当一个类有多个构造函数，或是多个同名方法，这些函数-方法应该按顺序出现在一起，中间不要放进其它函数-方法。" class="headerlink" title="[红] 4.4.5 当一个类有多个构造函数，或是多个同名方法，这些函数/方法应该按顺序出现在一起，中间不要放进其它函数/方法。"></a>[红] 4.4.5 当一个类有多个构造函数，或是多个同名方法，这些函数/方法应该按顺序出现在一起，中间不要放进其它函数/方法。</h3><p><a id="markdown-45-java" name="45-java"></a></p>
<h2 id="4-5-Java"><a href="#4-5-Java" class="headerlink" title="4.5 Java"></a>4.5 Java</h2><p><a id="markdown-红-451-override能用则用" name="红-451-override能用则用"></a></p>
<h3 id="红-4-5-1-Override：能用则用"><a href="#红-4-5-1-Override：能用则用" class="headerlink" title="[红] 4.5.1 @Override：能用则用"></a>[红] 4.5.1 <code>@Override</code>：能用则用</h3><p>只要是合法的，就把<code>@Override</code>注解给用上。</p>
<p><a id="markdown-红-452-捕获的异常不能忽视" name="红-452-捕获的异常不能忽视"></a></p>
<h3 id="红-4-5-2-捕获的异常：不能忽视"><a href="#红-4-5-2-捕获的异常：不能忽视" class="headerlink" title="[红] 4.5.2 捕获的异常：不能忽视"></a>[红] 4.5.2 捕获的异常：不能忽视</h3><p>除了下面的例子，对捕获的异常不做响应是极少正确的。(典型的响应方式是打印日志，或者如果它被认为是不可能的，则把它当作一个<code>AssertionError</code>重新抛出。)</p>
<p>如果它确实是不需要在catch块中做任何响应，需要做注释加以说明(如下面的例子)。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line">    <span class="keyword">int</span> i = Integer.parseInt(response);</span><br><span class="line">    <span class="keyword">return</span> handleNumericResponse(i);</span><br><span class="line">&#125; <span class="keyword">catch</span> (NumberFormatException ok) &#123;</span><br><span class="line">    <span class="comment">// it&#x27;s not numeric; that&#x27;s fine, just continue</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> handleTextResponse(response);</span><br></pre></td></tr></table></figure>

<p><strong>例外</strong>：在测试中，如果一个捕获的异常被命名为<code>expected</code>，则它可以被不加注释地忽略。下面是一种非常常见的情形，用以确保所测试的方法会抛出一个期望中的异常， 因此在这里就没有必要加注释。    </p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line">    emptyStack.pop();</span><br><span class="line">    fail();</span><br><span class="line">&#125; <span class="keyword">catch</span> (NoSuchElementException expected) &#123;</span><br><span class="line">    ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-453-静态成员使用类进行调用" name="红-453-静态成员使用类进行调用"></a></p>
<h3 id="红-4-5-3-静态成员：使用类进行调用"><a href="#红-4-5-3-静态成员：使用类进行调用" class="headerlink" title="[红] 4.5.3 静态成员：使用类进行调用"></a>[红] 4.5.3 静态成员：使用类进行调用</h3><p>使用类名调用静态的类成员，而不是具体某个对象或表达式</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Foo aFoo = ...;</span><br><span class="line">Foo.aStaticMethod(); <span class="comment">// good</span></span><br><span class="line">aFoo.aStaticMethod(); <span class="comment">// bad</span></span><br><span class="line">somethingThatYieldsAFoo().aStaticMethod(); <span class="comment">// very bad, Orz</span></span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-454-finalizers-禁用" name="红-454-finalizers-禁用"></a></p>
<h3 id="红-4-5-4-Finalizers-禁用"><a href="#红-4-5-4-Finalizers-禁用" class="headerlink" title="[红] 4.5.4 Finalizers: 禁用"></a>[红] 4.5.4 Finalizers: 禁用</h3><p>极少会去重写<code>Object.finalize</code>。</p>
<blockquote>
<p>Tip：不要使用finalize。如果你非要使用它，请先仔细阅读和理解<a target="_blank" rel="noopener" href="http://books.google.com/books?isbn=8131726592">Effective Java</a> 第7条款：“Avoid Finalizers”，然后不要使用它。</p>
</blockquote>
<p><a id="markdown-红-455-不论何时不允许有单词拼写错误并持续兼容这种错误有时候其实并没那么难" name="红-455-不论何时不允许有单词拼写错误并持续兼容这种错误有时候其实并没那么难"></a></p>
<h3 id="红-4-5-5-不论何时，不允许有单词拼写错误，并持续兼容这种错误有时候其实并没那么难"><a href="#红-4-5-5-不论何时，不允许有单词拼写错误，并持续兼容这种错误有时候其实并没那么难" class="headerlink" title="[红] 4.5.5 不论何时，不允许有单词拼写错误，并持续兼容这种错误有时候其实并没那么难"></a>[红] 4.5.5 不论何时，不允许有单词拼写错误，并持续兼容这种错误有时候其实并没那么难</h3><p>BAD:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">NetWrokWireless</span> <span class="keyword">extends</span> <span class="title">LinearLayout</span> </span>&#123;</span><br><span class="line">    ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>GOOD:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">NetWorkWireless</span> <span class="keyword">extends</span> <span class="title">LinearLayout</span> </span>&#123;</span><br><span class="line">    ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-456-不论何时不允许在代码中出现魔法数字" name="红-456-不论何时不允许在代码中出现魔法数字"></a></p>
<h3 id="红-4-5-6-不论何时，不允许在代码中出现魔法数字"><a href="#红-4-5-6-不论何时，不允许在代码中出现魔法数字" class="headerlink" title="[红] 4.5.6 不论何时，不允许在代码中出现魔法数字"></a>[红] 4.5.6 不论何时，不允许在代码中出现魔法数字</h3><p>BAD:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">switch</span> (paramInt) &#123;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">4</span>:</span><br><span class="line">        ...</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>GOOD:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">switch</span> (keyCode) &#123;</span><br><span class="line">    <span class="keyword">case</span> KeyEvent.KEYCODE_BACK:</span><br><span class="line">        ...</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>其实不会花多少时间，但是可读性强了很多倍。</p>
<p><a id="markdown-红-457-函数参数变量命名要有意义" name="红-457-函数参数变量命名要有意义"></a></p>
<h3 id="红-4-5-7-函数参数变量命名要有意义"><a href="#红-4-5-7-函数参数变量命名要有意义" class="headerlink" title="[红] 4.5.7 函数参数变量命名要有意义"></a>[红] 4.5.7 函数参数变量命名要有意义</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setCertificate</span><span class="params">(Spinner paramSpinner, String paramString1, String paramString2)</span> <span class="comment">//Bad</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    String str = <span class="string">&quot;keystore://&quot;</span> + paramString1;</span><br><span class="line">    <span class="keyword">if</span> ((paramString2 != <span class="keyword">null</span>) &amp;&amp; (paramString2.startsWith(str))) &#123;</span><br><span class="line">        setSelection(paramSpinner, paramString2.substring(str.length()));</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setCertificate</span><span class="params">(Spinner certSpinner, String certPath, String certName)</span> <span class="comment">//Good</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> ((certPath == <span class="keyword">null</span>) || (certName == <span class="keyword">null</span>)) &#123;</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (certName.startsWith(certPath)) &#123;</span><br><span class="line">        setSelection(certSpinner, certName.substring(certPath.length()));</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-458-条件判断语句中boolean类型的判断条件不能使用" name="红-458-条件判断语句中boolean类型的判断条件不能使用"></a></p>
<h3 id="红-4-5-8-条件判断语句中，boolean类型的判断条件不能使用"><a href="#红-4-5-8-条件判断语句中，boolean类型的判断条件不能使用" class="headerlink" title="[红] 4.5.8 条件判断语句中，boolean类型的判断条件不能使用=="></a>[红] 4.5.8 条件判断语句中，boolean类型的判断条件不能使用<code>==</code></h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (isFocused == <span class="keyword">true</span>) &#123; <span class="comment">//Very bad</span></span><br><span class="line">    ...</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (isFocused) &#123; <span class="comment">//Good</span></span><br><span class="line">    ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-459-字符串不允许用--运算符进行比较" name="红-459-字符串不允许用--运算符进行比较"></a></p>
<h3 id="红-4-5-9-字符串不允许用-运算符进行比较"><a href="#红-4-5-9-字符串不允许用-运算符进行比较" class="headerlink" title="[红] 4.5.9 字符串不允许用 == 运算符进行比较"></a>[红] 4.5.9 字符串不允许用 == 运算符进行比较</h3><p><a id="markdown-红-4510-代码中不允许使用硬编码的字符串" name="红-4510-代码中不允许使用硬编码的字符串"></a></p>
<h3 id="红-4-5-10-代码中不允许使用硬编码的字符串"><a href="#红-4-5-10-代码中不允许使用硬编码的字符串" class="headerlink" title="[红] 4.5.10 代码中不允许使用硬编码的字符串"></a>[红] 4.5.10 代码中不允许使用硬编码的字符串</h3><p>before:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (packageName.equals(<span class="string">&quot;com.cvte.tv.hotkey.setting&quot;</span>) &#123;</span><br><span class="line">    ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>请在类头部定义常量字符串或者在某个常量类中定义</p>
<p>after:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> String PACKAGE_NAME_SETTING = <span class="string">&quot;com.cvte.tv.hotkey.setting&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (PACKAGE_NAME_SETTING.equals(packageName)) &#123;</span><br><span class="line">    ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-黄-4511-常量的复用层次有五层跨应用共享常量应用内共享常量子工程内共享常量包内共享常量类内共享常量" name="黄-4511-常量的复用层次有五层跨应用共享常量应用内共享常量子工程内共享常量包内共享常量类内共享常量"></a></p>
<h3 id="黄-4-5-11-常量的复用层次有五层：跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量"><a href="#黄-4-5-11-常量的复用层次有五层：跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量" class="headerlink" title="[黄] 4.5.11 常量的复用层次有五层：跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量"></a>[黄] 4.5.11 常量的复用层次有五层：跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量</h3><ol>
<li>跨应用共享常量：放置在二方库中，通常是client.jar中的const目录下。</li>
<li>应用内共享常量：放置在一方库的modules中的const目录下。</li>
<li>子工程内部共享常量：即在当前子工程的const目录下。</li>
<li>包内共享常量：即在当前包下单独的const目录下。</li>
<li>类内共享常量：直接在类内部private static final定义。</li>
</ol>
<p><a id="markdown-红-4512-对于xxutils类统一命名为xxxutils并且将构造器私有所有的方法都应该是static的对外暴露的方法是public的并且类是不可被继承的即" name="红-4512-对于xxutils类统一命名为xxxutils并且将构造器私有所有的方法都应该是static的对外暴露的方法是public的并且类是不可被继承的即"></a></p>
<h3 id="红-4-5-12-对于XXUtils类统一命名为XXXUtils并且将构造器私有，所有的方法都应该是static的，对外暴露的方法是public的-并且类是不可被继承的，即"><a href="#红-4-5-12-对于XXUtils类统一命名为XXXUtils并且将构造器私有，所有的方法都应该是static的，对外暴露的方法是public的-并且类是不可被继承的，即" class="headerlink" title="[红] 4.5.12 对于XXUtils类统一命名为XXXUtils并且将构造器私有，所有的方法都应该是static的，对外暴露的方法是public的,并且类是不可被继承的，即:"></a>[红] 4.5.12 对于XXUtils类统一命名为XXXUtils并且将构造器私有，所有的方法都应该是static的，对外暴露的方法是public的,并且类是不可被继承的，即:</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">final</span> <span class="class"><span class="keyword">class</span> <span class="title">XXUtils</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="title">XXUtils</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">doOperationA</span><span class="params">(<span class="keyword">int</span> paramA,<span class="keyword">int</span> paramB)</span> </span>&#123;</span><br><span class="line">        <span class="comment">// …</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-4513-输入输出流打开一定要在finally中关闭否则会造成内存泄漏参考代码" name="红-4513-输入输出流打开一定要在finally中关闭否则会造成内存泄漏参考代码"></a></p>
<h3 id="红-4-5-13-输入-输出流打开一定要在finally中关闭，否则会造成内存泄漏，参考代码："><a href="#红-4-5-13-输入-输出流打开一定要在finally中关闭，否则会造成内存泄漏，参考代码：" class="headerlink" title="[红] 4.5.13 输入/输出流打开一定要在finally中关闭，否则会造成内存泄漏，参考代码："></a>[红] 4.5.13 输入/输出流打开一定要在finally中关闭，否则会造成内存泄漏，参考代码：</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">InputStream inputStream = <span class="keyword">null</span>;</span><br><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line">    inputStream.read(...);</span><br><span class="line">&#125; <span class="keyword">catch</span> (IOException ioe) &#123;</span><br><span class="line">    ...</span><br><span class="line">&#125; <span class="keyword">catch</span> (NullPointerException npe) &#123;</span><br><span class="line">    ...</span><br><span class="line">&#125; <span class="keyword">finally</span> &#123;</span><br><span class="line">    closeIoStream(inputStream);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">closeIoStream</span><span class="params">(Closeable ioStream)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">if</span>(<span class="keyword">null</span> != ioStream) &#123;</span><br><span class="line">            ioStream.close();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; <span class="keyword">catch</span> (IOException ioe) &#123;</span><br><span class="line">        ...</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-4514-多线程编程时对互斥资源的修改不能同步返回可以通过future方式返回或者提供listener但类似于这样的代码是不被允许的" name="红-4514-多线程编程时对互斥资源的修改不能同步返回可以通过future方式返回或者提供listener但类似于这样的代码是不被允许的"></a></p>
<h3 id="红-4-5-14-多线程编程时，对互斥资源的修改不能同步返回，可以通过Future方式返回或者提供listener，但类似于这样的代码是不被允许的："><a href="#红-4-5-14-多线程编程时，对互斥资源的修改不能同步返回，可以通过Future方式返回或者提供listener，但类似于这样的代码是不被允许的：" class="headerlink" title="[红] 4.5.14 多线程编程时，对互斥资源的修改不能同步返回，可以通过Future方式返回或者提供listener，但类似于这样的代码是不被允许的："></a>[红] 4.5.14 多线程编程时，对互斥资源的修改不能同步返回，可以通过Future方式返回或者提供listener，但类似于这样的代码是不被允许的：</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">getValue</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line">    handler.post(<span class="keyword">new</span> Runnable() &#123;</span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span> </span>&#123;</span><br><span class="line">            i += <span class="number">10</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line">    <span class="keyword">return</span> i;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-4515-类构造方法的定义要在一起定义不能隔了几个成员方法又定义一个构造器例如" name="红-4515-类构造方法的定义要在一起定义不能隔了几个成员方法又定义一个构造器例如"></a></p>
<h3 id="红-4-5-15-类构造方法的定义要在一起定义，不能隔了几个成员方法又定义一个构造器。例如："><a href="#红-4-5-15-类构造方法的定义要在一起定义，不能隔了几个成员方法又定义一个构造器。例如：" class="headerlink" title="[红] 4.5.15 类构造方法的定义要在一起定义，不能隔了几个成员方法又定义一个构造器。例如："></a>[红] 4.5.15 类构造方法的定义要在一起定义，不能隔了几个成员方法又定义一个构造器。例如：</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Sample</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">Sample</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        …</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">functionA</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        …</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">Sample</span><span class="params">(String param)</span> </span>&#123; <span class="comment">//Bad</span></span><br><span class="line">        …</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p><a id="markdown-红-4516-单例模式要注意是无参的不可以出现-getinstancecontext这样的方法有内存泄漏如果需要在一个单例类中用到context请使用application的context" name="红-4516-单例模式要注意是无参的不可以出现-getinstancecontext这样的方法有内存泄漏如果需要在一个单例类中用到context请使用application的context"></a></p>
<h3 id="红-4-5-16-单例模式要注意是无参的！不可以出现-getInstance-context-这样的方法，有内存泄漏，如果需要在一个单例类中用到context，请使用application的context"><a href="#红-4-5-16-单例模式要注意是无参的！不可以出现-getInstance-context-这样的方法，有内存泄漏，如果需要在一个单例类中用到context，请使用application的context" class="headerlink" title="[红] 4.5.16 单例模式要注意是无参的！不可以出现 getInstance(context);这样的方法，有内存泄漏，如果需要在一个单例类中用到context，请使用application的context"></a>[红] 4.5.16 单例模式要注意是无参的！不可以出现 getInstance(context);这样的方法，有内存泄漏，如果需要在一个单例类中用到context，请使用application的context</h3><p><a id="markdown-红-4517-不通过一个类的对象访问此类的静态变量或者方法" name="红-4517-不通过一个类的对象访问此类的静态变量或者方法"></a></p>
<h3 id="红-4-5-17-不通过一个类的对象访问此类的静态变量或者方法"><a href="#红-4-5-17-不通过一个类的对象访问此类的静态变量或者方法" class="headerlink" title="[红] 4.5.17 不通过一个类的对象访问此类的静态变量或者方法"></a>[红] 4.5.17 不通过一个类的对象访问此类的静态变量或者方法</h3><p><a id="markdown-黄-4518-尽量少用可变参数编程用数组或者容器更直观" name="黄-4518-尽量少用可变参数编程用数组或者容器更直观"></a></p>
<h3 id="黄-4-5-18-尽量少用可变参数编程，用数组或者容器更直观"><a href="#黄-4-5-18-尽量少用可变参数编程，用数组或者容器更直观" class="headerlink" title="[黄] 4.5.18 尽量少用可变参数编程，用数组或者容器更直观"></a>[黄] 4.5.18 尽量少用可变参数编程，用数组或者容器更直观</h3><p><a id="markdown-红-4519-对外暴露的非private方法原则上不允许修改函数签名在发布的时候请仔细检查是否有拼写错误或者参数错误原则上不允许删除修改如果不再推荐使用请打上deprecated注解并明确说明新接口" name="红-4519-对外暴露的非private方法原则上不允许修改函数签名在发布的时候请仔细检查是否有拼写错误或者参数错误原则上不允许删除修改如果不再推荐使用请打上deprecated注解并明确说明新接口"></a></p>
<h3 id="红-4-5-19-对外暴露的非private方法，原则上不允许修改函数签名，在发布的时候请仔细检查是否有拼写错误或者参数错误，原则上不允许删除，修改。如果不再推荐使用请打上-Deprecated注解并明确说明新接口"><a href="#红-4-5-19-对外暴露的非private方法，原则上不允许修改函数签名，在发布的时候请仔细检查是否有拼写错误或者参数错误，原则上不允许删除，修改。如果不再推荐使用请打上-Deprecated注解并明确说明新接口" class="headerlink" title="[红] 4.5.19 对外暴露的非private方法，原则上不允许修改函数签名，在发布的时候请仔细检查是否有拼写错误或者参数错误，原则上不允许删除，修改。如果不再推荐使用请打上@Deprecated注解并明确说明新接口"></a>[红] 4.5.19 对外暴露的非private方法，原则上不允许修改函数签名，在发布的时候请仔细检查是否有拼写错误或者参数错误，原则上不允许删除，修改。如果不再推荐使用请打上@Deprecated注解并明确说明新接口</h3><p><a id="markdown-黄-4520-不使用sdk标注的deprecated方法" name="黄-4520-不使用sdk标注的deprecated方法"></a></p>
<h3 id="黄-4-5-20-不使用sdk标注的-Deprecated方法"><a href="#黄-4-5-20-不使用sdk标注的-Deprecated方法" class="headerlink" title="[黄] 4.5.20 不使用sdk标注的@Deprecated方法"></a>[黄] 4.5.20 不使用sdk标注的@Deprecated方法</h3><p><a id="markdown-红-4521-object的equals方法容易抛空指针异常应使用常量或确定有值的对象来调用equals" name="红-4521-object的equals方法容易抛空指针异常应使用常量或确定有值的对象来调用equals"></a></p>
<h3 id="红-4-5-21-Object的equals方法容易抛空指针异常，应使用常量或确定有值的对象来调用equals"><a href="#红-4-5-21-Object的equals方法容易抛空指针异常，应使用常量或确定有值的对象来调用equals" class="headerlink" title="[红] 4.5.21 Object的equals方法容易抛空指针异常，应使用常量或确定有值的对象来调用equals"></a>[红] 4.5.21 Object的equals方法容易抛空指针异常，应使用常量或确定有值的对象来调用equals</h3><p><a id="markdown-红-4522-所有包装类智能使用equals进行比较不可以使用" name="红-4522-所有包装类智能使用equals进行比较不可以使用"></a></p>
<h3 id="红-4-5-22-所有包装类只能使用equals进行比较不可以使用"><a href="#红-4-5-22-所有包装类只能使用equals进行比较不可以使用" class="headerlink" title="[红] 4.5.22 所有包装类只能使用equals进行比较不可以使用=="></a>[红] 4.5.22 所有包装类只能使用equals进行比较不可以使用==</h3><p><a id="markdown-黄-4523-构造方法中不允许加入任何业务逻辑如果需要请放到init中" name="黄-4523-构造方法中不允许加入任何业务逻辑如果需要请放到init中"></a></p>
<h3 id="黄-4-5-23-构造方法中不允许加入任何业务逻辑，如果需要，请放到init-中"><a href="#黄-4-5-23-构造方法中不允许加入任何业务逻辑，如果需要，请放到init-中" class="headerlink" title="[黄] 4.5.23 构造方法中不允许加入任何业务逻辑，如果需要，请放到init()中"></a>[黄] 4.5.23 构造方法中不允许加入任何业务逻辑，如果需要，请放到init()中</h3><p><a id="markdown-红-4524-不在循环体内进行字符串的拼接如果需要请用stringbuilder" name="红-4524-不在循环体内进行字符串的拼接如果需要请用stringbuilder"></a></p>
<h3 id="红-4-5-24-不在循环体内进行字符串的拼接，如果需要请用StringBuilder"><a href="#红-4-5-24-不在循环体内进行字符串的拼接，如果需要请用StringBuilder" class="headerlink" title="[红] 4.5.24 不在循环体内进行字符串的拼接，如果需要请用StringBuilder"></a>[红] 4.5.24 不在循环体内进行字符串的拼接，如果需要请用StringBuilder</h3><p><a id="markdown-红-4525-慎用clone函数进行拷贝它是浅拷贝" name="红-4525-慎用clone函数进行拷贝它是浅拷贝"></a></p>
<h3 id="红-4-5-25-慎用clone函数进行拷贝，它是浅拷贝"><a href="#红-4-5-25-慎用clone函数进行拷贝，它是浅拷贝" class="headerlink" title="[红] 4.5.25 慎用clone函数进行拷贝，它是浅拷贝"></a>[红] 4.5.25 慎用clone函数进行拷贝，它是浅拷贝</h3><p><a id="markdown-红-4526-对于如下情况要使用单例模式" name="红-4526-对于如下情况要使用单例模式"></a></p>
<h3 id="红-4-5-26-对于如下情况，要使用单例模式："><a href="#红-4-5-26-对于如下情况，要使用单例模式：" class="headerlink" title="[红] 4.5.26 对于如下情况，要使用单例模式："></a>[红] 4.5.26 对于如下情况，要使用单例模式：</h3><ul>
<li>为了避免由于资源频繁操作时导致的性能或损耗，如日志文件，应用配置</li>
<li>为了方便各模块之间的互相通信和资源共享，如线程池等</li>
</ul>
<p><a id="markdown-红-4527-android宏控制类型的属性名称应该是ro开头属性应该当做常量来使用不用每次都来读取属性" name="红-4527-android宏控制类型的属性名称应该是ro开头属性应该当做常量来使用不用每次都来读取属性"></a></p>
<h3 id="红-4-5-27-android宏控制类型的属性名称应该是ro-开头-属性应该当做常量来使用，不用每次都来读取属性。"><a href="#红-4-5-27-android宏控制类型的属性名称应该是ro-开头-属性应该当做常量来使用，不用每次都来读取属性。" class="headerlink" title="[红] 4.5.27 android宏控制类型的属性名称应该是ro.开头;属性应该当做常量来使用，不用每次都来读取属性。"></a>[红] 4.5.27 android宏控制类型的属性名称应该是ro.开头;属性应该当做常量来使用，不用每次都来读取属性。</h3><p>BAD:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (MenuConfigManager.getInstance().getProperty(<span class="string">&quot;enable_set_audio_prescaler&quot;</span>, <span class="string">&quot;0&quot;</span>).equals(<span class="string">&quot;1&quot;</span>)) &#123;</span><br><span class="line">    preScaleApi.eventSoundPreScalerSetValue(isMute ? WALTON_MUTE_PRESCALE : WALTON_UNMUTE_PRESCALE);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>GOOD:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> CVT_EN_CNC_FACTORY_MODE = SystemProperties.getInt(<span class="string">&quot;ro.CVT_EN_CNC_FACTORY_MODE&quot;</span>, <span class="number">0</span>);</span><br><span class="line"><span class="keyword">if</span> (CVT_EN_CNC_FACTORY_MODE == <span class="number">1</span>) &#123;</span><br><span class="line">    ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
      </div>
      
      
      
    </div>
    

    
    
    


          </div>
          

<script>
  window.addEventListener('tabs:register', () => {
    let { activeClass } = CONFIG.comments;
    if (CONFIG.comments.storage) {
      activeClass = localStorage.getItem('comments_active') || activeClass;
    }
    if (activeClass) {
      let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
      if (activeTab) {
        activeTab.click();
      }
    }
  });
  if (CONFIG.comments.storage) {
    window.addEventListener('tabs:click', event => {
      if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
      let commentClass = event.target.classList[1];
      localStorage.setItem('comments_active', commentClass);
    });
  }
</script>

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="header-overlay"></div>
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
          <div class="post-toc motion-element"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#Java-%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83"><span class="nav-number">1.</span> <span class="nav-text">Java 编码规范</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%A8%8B%E5%BA%8F%E5%91%98%E7%9A%84%E8%81%8C%E4%B8%9A%E7%B4%A0%E5%85%BB"><span class="nav-number">2.</span> <span class="nav-text">程序员的职业素养</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E7%BC%96%E7%A0%81%E6%98%AF%E4%B8%80%E9%97%A8%E6%89%8B%E8%89%BA%EF%BC%8C%E6%88%91%E4%BB%AC%E9%83%BD%E6%98%AF%E5%8C%A0%E4%BA%BA"><span class="nav-number">2.1.</span> <span class="nav-text">编码是一门手艺，我们都是匠人</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%AF%B7%E5%AF%B9%E4%BB%A3%E7%A0%81%E6%80%80%E6%9C%89%E6%95%AC%E7%95%8F%E4%B9%8B%E5%BF%83"><span class="nav-number">2.2.</span> <span class="nav-text">请对代码怀有敬畏之心</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E7%BC%96%E7%A0%81%E6%98%AF%E4%B8%80%E7%A7%8D%E8%B4%A3%E4%BB%BB"><span class="nav-number">2.3.</span> <span class="nav-text">编码是一种责任</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%AF%B7%E5%AF%B9%E4%BD%A0%E8%87%AA%E5%B7%B1%E5%86%99%E7%9A%84%E4%BB%A3%E7%A0%81%E8%B4%9F%E8%B4%A3"><span class="nav-number">2.4.</span> <span class="nav-text">请对你自己写的代码负责</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%AF%B7%E5%9C%A8%E4%BD%A0%E7%9A%84%E4%BD%9C%E5%93%81%E4%B8%8A%E7%BD%B2%E5%90%8D%EF%BC%8C%E5%B9%B6%E9%83%91%E9%87%8D%E7%9A%84%E6%89%BF%E8%AF%BA%E2%80%94%E2%80%94%E4%B8%BA%E4%BA%86%E8%BF%99%E6%AE%B5%E4%BB%A3%E7%A0%81%E6%88%91%E5%B7%B2%E7%94%A8%E5%B0%BD%E6%88%91%E7%9A%84%E5%85%A8%E5%8A%9B"><span class="nav-number">2.5.</span> <span class="nav-text">请在你的作品上署名，并郑重的承诺——为了这段代码我已用尽我的全力</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%AF%B7%E4%B8%8D%E8%A6%81%E7%BC%96%E5%86%99%E4%BD%A0%E8%87%AA%E5%B7%B1%E4%B8%8D%E6%87%82%E7%9A%84%E4%BB%A3%E7%A0%81"><span class="nav-number">2.6.</span> <span class="nav-text">请不要编写你自己不懂的代码</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E6%88%91%E4%BB%AC%E5%85%81%E8%AE%B8%E4%BD%A0%E5%AF%BB%E6%B1%82%E5%B8%AE%E5%8A%A9%EF%BC%8C%E5%85%81%E8%AE%B8%E4%BD%A0%E6%8B%B7%E8%B4%9D"><span class="nav-number">2.7.</span> <span class="nav-text">我们允许你寻求帮助，允许你拷贝</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E4%BD%86%E2%80%94%E2%80%94"><span class="nav-number">2.8.</span> <span class="nav-text">但——</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%9C%A8%E4%BD%A0%E5%BC%84%E6%87%82%E4%BD%A0%E5%86%99%E4%B8%8B%E7%9A%84%E4%BB%A3%E7%A0%81%E7%9A%84%E5%AE%9E%E9%99%85%E5%90%AB%E4%B9%89%E4%B9%8B%E5%89%8D%EF%BC%8C%E8%AF%B7%E4%B8%8D%E8%A6%81%E6%8A%8A%E5%AE%83%E5%90%88%E5%B9%B6%E5%88%B0%E4%BD%A0%E7%9A%84%E4%BD%9C%E5%93%81%E4%B8%AD%E5%8E%BB"><span class="nav-number">2.9.</span> <span class="nav-text">在你弄懂你写下的代码的实际含义之前，请不要把它合并到你的作品中去</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E6%88%91%EF%BC%8C%E8%A6%81%E5%81%9A%E4%B8%80%E5%90%8D%E6%9C%89%E7%B4%A0%E5%85%BB%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%91%98"><span class="nav-number">2.10.</span> <span class="nav-text">我，要做一名有素养的程序员</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%9B%AE%E5%BD%95"><span class="nav-number">3.</span> <span class="nav-text">目录</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#1-%E6%BA%90%E6%96%87%E4%BB%B6%E8%A6%81%E6%B1%82"><span class="nav-number">4.</span> <span class="nav-text">1. 源文件要求</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-1-%E6%96%87%E4%BB%B6%E5%90%8D"><span class="nav-number">4.1.</span> <span class="nav-text">1.1 文件名</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-1-1-1-%E6%BA%90%E6%96%87%E4%BB%B6%E4%BB%A5%E5%85%B6%E6%9C%80%E9%A1%B6%E5%B1%82%E7%9A%84%E7%B1%BB%E5%90%8D%E6%9D%A5%E5%91%BD%E5%90%8D%EF%BC%8C%E5%A4%A7%E5%B0%8F%E5%86%99%E6%95%8F%E6%84%9F%EF%BC%8C%E6%96%87%E4%BB%B6%E6%89%A9%E5%B1%95%E5%90%8D%E4%B8%BA-java"><span class="nav-number">4.1.1.</span> <span class="nav-text">[红] 1.1.1 源文件以其最顶层的类名来命名，大小写敏感，文件扩展名为.java</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-1-1-2-%E6%BA%90%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81%E6%A0%BC%E5%BC%8F%E4%B8%BAUTF-8"><span class="nav-number">4.1.2.</span> <span class="nav-text">[红] 1.1.2 源文件编码格式为UTF-8</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#1-2-%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6"><span class="nav-number">4.2.</span> <span class="nav-text">1.2 特殊字符</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-1-2-1-%E9%99%A4%E4%BA%86%E8%A1%8C%E7%BB%93%E6%9D%9F%E7%AC%A6%E5%BA%8F%E5%88%97%EF%BC%8CASCII%E6%B0%B4%E5%B9%B3%E7%A9%BA%E6%A0%BC%E5%AD%97%E7%AC%A6-0x20%EF%BC%8C%E5%8D%B3%E7%A9%BA%E6%A0%BC-%E6%98%AF%E6%BA%90%E6%96%87%E4%BB%B6%E4%B8%AD%E5%94%AF%E4%B8%80%E5%85%81%E8%AE%B8%E5%87%BA%E7%8E%B0%E7%9A%84%E7%A9%BA%E7%99%BD%E5%AD%97%E7%AC%A6"><span class="nav-number">4.2.1.</span> <span class="nav-text">[黄] 1.2.1 除了行结束符序列，ASCII水平空格字符(0x20，即空格)是源文件中唯一允许出现的空白字符</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-1-2-2-%E5%AF%B9%E4%BA%8E%E5%85%B7%E6%9C%89%E7%89%B9%E6%AE%8A%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97%E7%9A%84%E4%BB%BB%E4%BD%95%E5%AD%97%E7%AC%A6-b-t-n-f-r-%EF%BC%8C%E6%88%91%E4%BB%AC%E4%BD%BF%E7%94%A8%E5%AE%83%E7%9A%84%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E7%9B%B8%E5%BA%94%E7%9A%84%E5%85%AB%E8%BF%9B%E5%88%B6-%E6%AF%94%E5%A6%82-012-%E6%88%96Unicode-%E6%AF%94%E5%A6%82-u000a-%E8%BD%AC%E4%B9%89"><span class="nav-number">4.2.2.</span> <span class="nav-text">[红] 1.2.2 对于具有特殊转义序列的任何字符(\b, \t, \n, \f, \r)，我们使用它的转义序列，而不是相应的八进制(比如\012)或Unicode(比如\u000a)转义</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-1-2-3-%E5%AF%B9%E4%BA%8E%E5%89%A9%E4%BD%99%E7%9A%84%E9%9D%9EASCII%E5%AD%97%E7%AC%A6%EF%BC%8C%E6%98%AF%E4%BD%BF%E7%94%A8%E5%AE%9E%E9%99%85%E7%9A%84Unicode%E5%AD%97%E7%AC%A6-%E6%AF%94%E5%A6%82%E2%88%9E-%EF%BC%8C%E8%BF%98%E6%98%AF%E4%BD%BF%E7%94%A8%E7%AD%89%E4%BB%B7%E7%9A%84Unicode%E8%BD%AC%E4%B9%89%E7%AC%A6-%E6%AF%94%E5%A6%82-u221e-%EF%BC%8C%E5%8F%96%E5%86%B3%E4%BA%8E%E5%93%AA%E4%B8%AA%E8%83%BD%E8%AE%A9%E4%BB%A3%E7%A0%81%E6%9B%B4%E6%98%93%E4%BA%8E%E9%98%85%E8%AF%BB%E5%92%8C%E7%90%86%E8%A7%A3"><span class="nav-number">4.2.3.</span> <span class="nav-text">[红] 1.2.3 对于剩余的非ASCII字符，是使用实际的Unicode字符(比如∞)，还是使用等价的Unicode转义符(比如\u221e)，取决于哪个能让代码更易于阅读和理解</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#1-3-%E6%BA%90%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84"><span class="nav-number">4.3.</span> <span class="nav-text">1.3 源文件结构</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-1-3-1-%E4%B8%80%E4%B8%AA%E6%BA%90%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB-%E6%8C%89%E9%A1%BA%E5%BA%8F%E5%9C%B0-%EF%BC%9A"><span class="nav-number">4.3.1.</span> <span class="nav-text">[黄] 1.3.1 一个源文件包含(按顺序地)：</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-1-3-2-%E5%A6%82%E6%9E%9C%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E8%AE%B8%E5%8F%AF%E8%AF%81%E6%88%96%E7%89%88%E6%9D%83%E4%BF%A1%E6%81%AF%EF%BC%8C%E9%82%A3%E4%B9%88%E5%AE%83%E5%BA%94%E5%BD%93%E8%A2%AB%E6%94%BE%E5%9C%A8%E6%96%87%E4%BB%B6%E6%9C%80%E5%89%8D%E9%9D%A2%E3%80%82"><span class="nav-number">4.3.2.</span> <span class="nav-text">[黄] 1.3.2 如果一个文件包含许可证或版权信息，那么它应当被放在文件最前面。</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-1-3-3-package%E8%AF%AD%E5%8F%A5%E4%B8%8D%E6%8D%A2%E8%A1%8C%EF%BC%8C%E5%88%97%E9%99%90%E5%88%B6%E5%B9%B6%E4%B8%8D%E9%80%82%E7%94%A8%E4%BA%8Epackage%E8%AF%AD%E5%8F%A5%E3%80%82-%E5%8D%B3package%E8%AF%AD%E5%8F%A5%E5%86%99%E5%9C%A8%E4%B8%80%E8%A1%8C%E9%87%8C"><span class="nav-number">4.3.3.</span> <span class="nav-text">[红] 1.3.3 package语句不换行，列限制并不适用于package语句。(即package语句写在一行里)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#1-3-4-import%E8%AF%AD%E5%8F%A5%E8%A6%81%E6%B1%82"><span class="nav-number">4.3.4.</span> <span class="nav-text">1.3.4 import语句要求</span></a></li></ol></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#2-%E6%A0%BC%E5%BC%8F"><span class="nav-number">5.</span> <span class="nav-text">2. 格式</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#2-1-%E5%A4%A7%E6%8B%AC%E5%8F%B7"><span class="nav-number">5.1.</span> <span class="nav-text">2.1 大括号</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-1-1-%E5%A4%A7%E6%8B%AC%E5%8F%B7%E4%B8%8Eif-else-for-do-while%E8%AF%AD%E5%8F%A5%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8%EF%BC%8C%E5%8D%B3%E4%BD%BF%E5%8F%AA%E6%9C%89%E4%B8%80%E6%9D%A1%E8%AF%AD%E5%8F%A5-%E6%88%96%E6%98%AF%E7%A9%BA-%EF%BC%8C%E4%B9%9F%E5%BA%94%E8%AF%A5%E6%8A%8A%E5%A4%A7%E6%8B%AC%E5%8F%B7%E5%86%99%E4%B8%8A"><span class="nav-number">5.1.1.</span> <span class="nav-text">[红] 2.1.1 大括号与if, else, for, do, while语句一起使用，即使只有一条语句(或是空)，也应该把大括号写上</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-1-2-%E5%AF%B9%E4%BA%8E%E9%9D%9E%E7%A9%BA%E5%9D%97%E5%92%8C%E5%9D%97%E7%8A%B6%E7%BB%93%E6%9E%84%EF%BC%8C%E5%A4%A7%E6%8B%AC%E5%8F%B7%E9%81%B5%E5%BE%AAKernighan%E5%92%8CRitchie%E9%A3%8E%E6%A0%BC-Egyptian-brackets"><span class="nav-number">5.1.2.</span> <span class="nav-text">[红] 2.1.2 对于非空块和块状结构，大括号遵循Kernighan和Ritchie风格 (Egyptian brackets)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-1-3-%E5%A6%82%E6%9E%9C%E5%AE%83%E6%98%AF%E4%B8%80%E4%B8%AA%E5%A4%9A%E5%9D%97%E8%AF%AD%E5%8F%A5%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86-if-else%E6%88%96try-catch-finally-%EF%BC%8C%E5%8D%B3%E4%BD%BF%E5%A4%A7%E6%8B%AC%E5%8F%B7%E5%86%85%E6%B2%A1%E5%86%85%E5%AE%B9%EF%BC%8C%E5%8F%B3%E5%A4%A7%E6%8B%AC%E5%8F%B7%E4%B9%9F%E8%A6%81%E6%8D%A2%E8%A1%8C"><span class="nav-number">5.1.3.</span> <span class="nav-text">[红] 2.1.3 如果它是一个多块语句的一部分(if&#x2F;else或try&#x2F;catch&#x2F;finally)，即使大括号内没内容，右大括号也要换行</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-2-%E7%A9%BA%E7%99%BD"><span class="nav-number">5.2.</span> <span class="nav-text">2.2 空白</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-2-1-%E7%A9%BA%E8%A1%8C%E7%9A%84%E4%BD%BF%E7%94%A8"><span class="nav-number">5.2.1.</span> <span class="nav-text">[红] 2.2.1 空行的使用</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-2-2-%E4%B8%8D%E5%85%81%E8%AE%B8%E5%A4%9A%E4%B8%AA%E8%BF%9E%E7%BB%AD%E7%9A%84%E7%A9%BA%E8%A1%8C"><span class="nav-number">5.2.2.</span> <span class="nav-text">[红] 2.2.2 不允许多个连续的空行</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-2-3-%E7%A9%BA%E6%A0%BC%E7%9A%84%E4%BD%BF%E7%94%A8"><span class="nav-number">5.2.3.</span> <span class="nav-text">[红] 2.2.3 空格的使用</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-2-2-4-%E4%B8%8D%E8%A6%81%E5%81%9A%E6%B0%B4%E5%B9%B3%E5%AF%B9%E9%BD%90"><span class="nav-number">5.2.4.</span> <span class="nav-text">[黄] 2.2.4 不要做水平对齐</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-2-5-%E4%B8%8D%E5%85%81%E8%AE%B8%E6%9C%89%E8%B6%85%E8%BF%873%E5%B1%82%E7%9A%84if%E5%B5%8C%E5%A5%97"><span class="nav-number">5.2.5.</span> <span class="nav-text">[红] 2.2.5 不允许有超过3层的if嵌套</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-2-6-%E4%BB%BB%E4%BD%95%E8%BF%90%E7%AE%97%E7%AC%A6%E5%B7%A6%E5%8F%B3%E5%BF%85%E9%A1%BB%E5%8A%A0%E4%B8%80%E4%B8%AA%E7%A9%BA%E6%A0%BC"><span class="nav-number">5.2.6.</span> <span class="nav-text">[红] 2.2.6 任何运算符左右必须加一个空格</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-2-2-7-%E7%94%A8%E5%B0%8F%E6%8B%AC%E5%8F%B7%E6%9D%A5%E9%99%90%E5%AE%9A%E7%BB%84"><span class="nav-number">5.2.7.</span> <span class="nav-text">[黄] 2.2.7 用小括号来限定组</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-2-8-%E5%B7%A6%E6%8B%AC%E5%8F%B7%E5%92%8C%E5%90%8E%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B9%8B%E9%97%B4%E4%B8%8D%E5%87%BA%E7%8E%B0%E7%A9%BA%E6%A0%BC%EF%BC%9B%E5%90%8C%E6%A0%B7%EF%BC%8C%E5%8F%B3%E6%8B%AC%E5%8F%B7%E5%92%8C%E5%89%8D%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B9%8B%E9%97%B4%E4%B9%9F%E4%B8%8D%E5%87%BA%E7%8E%B0%E7%A9%BA%E6%A0%BC"><span class="nav-number">5.2.8.</span> <span class="nav-text">[红] 2.2.8 左括号和后一个字符之间不出现空格；同样，右括号和前一个字符之间也不出现空格</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-2-9-if-for-while-switch-do%E7%AD%89%E4%BF%9D%E7%95%99%E5%AD%97%E4%B8%8E%E5%B7%A6%E5%8F%B3%E6%8B%AC%E5%8F%B7%E4%B9%8B%E9%97%B4%E9%83%BD%E5%BF%85%E9%A1%BB%E5%8A%A0%E7%A9%BA%E6%A0%BC"><span class="nav-number">5.2.9.</span> <span class="nav-text">[红] 2.2.9 if&#x2F;for&#x2F;while&#x2F;switch&#x2F;do等保留字与左右括号之间都必须加空格</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-3-%E6%9E%9A%E4%B8%BE"><span class="nav-number">5.3.</span> <span class="nav-text">2.3 枚举</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-3-1-%E6%9E%9A%E4%B8%BE%E5%B8%B8%E9%87%8F%E9%97%B4%E7%94%A8%E9%80%97%E5%8F%B7%E9%9A%94%E5%BC%80%EF%BC%8C%E6%8D%A2%E8%A1%8C%E5%8F%AF%E9%80%89%EF%BC%8C%E6%B2%A1%E6%9C%89%E6%96%B9%E6%B3%95%E5%92%8C%E6%96%87%E6%A1%A3%E7%9A%84%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%8F%AF%E5%86%99%E6%88%90%E6%95%B0%E7%BB%84%E5%88%9D%E5%A7%8B%E5%8C%96%E7%9A%84%E6%A0%BC%E5%BC%8F"><span class="nav-number">5.3.1.</span> <span class="nav-text">[红] 2.3.1 枚举常量间用逗号隔开，换行可选，没有方法和文档的枚举类可写成数组初始化的格式</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-4-%E5%8F%98%E9%87%8F"><span class="nav-number">5.4.</span> <span class="nav-text">2.4 变量</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-4-1-%E6%AF%8F%E6%AC%A1%E5%8F%AA%E5%A3%B0%E6%98%8E%E4%B8%80%E4%B8%AA%E5%8F%98%E9%87%8F"><span class="nav-number">5.4.1.</span> <span class="nav-text">[红] 2.4.1 每次只声明一个变量</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-4-2-%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F%E9%9C%80%E8%A6%81%E6%97%B6%E6%89%8D%E5%A3%B0%E6%98%8E%EF%BC%8C%E5%A3%B0%E6%98%8E%E7%9A%84%E5%90%8C%E6%97%B6%E8%A6%81%E8%BF%9B%E8%A1%8C%E5%88%9D%E5%A7%8B%E5%8C%96"><span class="nav-number">5.4.2.</span> <span class="nav-text">[红] 2.4.2 局部变量需要时才声明，声明的同时要进行初始化</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-5-%E6%95%B0%E7%BB%84"><span class="nav-number">5.5.</span> <span class="nav-text">2.5 数组</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-2-5-1-%E6%95%B0%E7%BB%84%E5%88%9D%E5%A7%8B%E5%8C%96%EF%BC%9A%E5%8F%AF%E5%86%99%E6%88%90%E5%9D%97%E7%8A%B6%E7%BB%93%E6%9E%84"><span class="nav-number">5.5.1.</span> <span class="nav-text">[黄] 2.5.1 数组初始化：可写成块状结构</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-5-2-%E9%9D%9EC%E9%A3%8E%E6%A0%BC%E7%9A%84%E6%95%B0%E7%BB%84%E5%A3%B0%E6%98%8E"><span class="nav-number">5.5.2.</span> <span class="nav-text">[红] 2.5.2 非C风格的数组声明</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-6-switch%E8%AF%AD%E5%8F%A5"><span class="nav-number">5.6.</span> <span class="nav-text">2.6 switch语句</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-6-1-%E7%BC%A9%E8%BF%9B"><span class="nav-number">5.6.1.</span> <span class="nav-text">[红] 2.6.1 缩进</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-6-2-Fall-through%EF%BC%9A%E6%B3%A8%E9%87%8A"><span class="nav-number">5.6.2.</span> <span class="nav-text">[红] 2.6.2 Fall-through：注释</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-6-3-default%E7%9A%84%E6%83%85%E5%86%B5%E8%A6%81%E5%86%99%E5%87%BA%E6%9D%A5"><span class="nav-number">5.6.3.</span> <span class="nav-text">[红] 2.6.3 default的情况要写出来</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-7-%E6%B3%A8%E8%A7%A3-Annotations"><span class="nav-number">5.7.</span> <span class="nav-text">2.7 注解(Annotations)</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-7-1-%E6%B3%A8%E8%A7%A3%E7%B4%A7%E8%B7%9F%E5%9C%A8%E6%96%87%E6%A1%A3%E5%9D%97%E5%90%8E%E9%9D%A2%EF%BC%8C%E5%BA%94%E7%94%A8%E4%BA%8E%E7%B1%BB%E3%80%81%E6%96%B9%E6%B3%95%E5%92%8C%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%EF%BC%8C%E4%B8%80%E4%B8%AA%E6%B3%A8%E8%A7%A3%E7%8B%AC%E5%8D%A0%E4%B8%80%E8%A1%8C%E3%80%82%E8%BF%99%E4%BA%9B%E6%8D%A2%E8%A1%8C%E4%B8%8D%E5%B1%9E%E4%BA%8E%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C%EF%BC%8C%E5%9B%A0%E6%AD%A4%E7%BC%A9%E8%BF%9B%E7%BA%A7%E5%88%AB%E4%B8%8D%E5%8F%98"><span class="nav-number">5.7.1.</span> <span class="nav-text">[红] 2.7.1 注解紧跟在文档块后面，应用于类、方法和构造函数，一个注解独占一行。这些换行不属于自动换行，因此缩进级别不变</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-8-%E6%B3%A8%E9%87%8A"><span class="nav-number">5.8.</span> <span class="nav-text">2.8 注释</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-8-1-%E5%9D%97%E6%B3%A8%E9%87%8A%E9%A3%8E%E6%A0%BC"><span class="nav-number">5.8.1.</span> <span class="nav-text">[红] 2.8.1 块注释风格</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-2-8-2-%E4%BF%AE%E5%A4%8Dbug%E9%9C%80%E8%A6%81%E5%A2%9E%E5%8A%A0%E6%B3%A8%E9%87%8A%EF%BC%8C%E8%A7%A3%E5%86%B3%E4%BA%86%E4%BB%80%E4%B9%88bug%EF%BC%8Cbug%E5%8E%9F%E5%9B%A0%EF%BC%8C%E9%80%9A%E8%BF%87%E4%BD%95%E7%A7%8D%E6%96%B9%E5%BC%8F"><span class="nav-number">5.8.2.</span> <span class="nav-text">[黄] 2.8.2 修复bug需要增加注释，解决了什么bug，bug原因，通过何种方式</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-8-3-%E4%B8%8D%E5%8F%AF%E4%BB%A5%E5%87%BA%E7%8E%B0%E6%B3%A8%E9%87%8A%E4%BB%85%E4%BB%85%E6%98%AF%E4%B8%BA%E4%BA%86%E4%BB%A3%E7%A0%81%E4%B8%8D%E8%BF%90%E8%A1%8C%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%98%AF%E5%9B%A0%E4%B8%BA%E4%BB%A5%E5%90%8E%E5%8F%AF%E8%83%BD%E4%BC%9A%E7%94%A8%E5%88%B0%E8%80%8C%E4%BF%9D%E7%95%99%EF%BC%8C%E4%B8%80%E5%AE%9A%E7%94%A8%E6%B3%A8%E9%87%8A%E8%AF%B4%E6%98%8E%EF%BC%8C%E5%90%A6%E5%88%99%E8%AF%B7%E4%B8%80%E5%AE%9A%E4%B8%80%E5%BE%8B%E5%88%A0%E6%8E%89"><span class="nav-number">5.8.3.</span> <span class="nav-text">[红] 2.8.3 不可以出现注释仅仅是为了代码不运行，如果是因为以后可能会用到而保留，一定用注释说明，否则请一定一律删掉</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-9-%E5%85%B6%E4%BB%96"><span class="nav-number">5.9.</span> <span class="nav-text">2.9 其他</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-9-1-%E5%9D%97%E7%BC%A9%E8%BF%9B%EF%BC%9A4%E4%B8%AA%E7%A9%BA%E6%A0%BC%EF%BC%8C%E6%AF%8F%E5%BD%93%E5%BC%80%E5%A7%8B%E4%B8%80%E4%B8%AA%E6%96%B0%E7%9A%84%E5%9D%97%EF%BC%8C%E7%BC%A9%E8%BF%9B%E5%A2%9E%E5%8A%A04%E4%B8%AA%E7%A9%BA%E6%A0%BC%EF%BC%8C%E5%BD%93%E5%9D%97%E7%BB%93%E6%9D%9F%E6%97%B6%EF%BC%8C%E7%BC%A9%E8%BF%9B%E8%BF%94%E5%9B%9E%E5%85%88%E5%89%8D%E7%9A%84%E7%BC%A9%E8%BF%9B%E7%BA%A7%E5%88%AB%E3%80%82%E7%BC%A9%E8%BF%9B%E7%BA%A7%E5%88%AB%E9%80%82%E7%94%A8%E4%BA%8E%E4%BB%A3%E7%A0%81%E5%92%8C%E6%B3%A8%E9%87%8A"><span class="nav-number">5.9.1.</span> <span class="nav-text">[红] 2.9.1 块缩进：4个空格，每当开始一个新的块，缩进增加4个空格，当块结束时，缩进返回先前的缩进级别。缩进级别适用于代码和注释</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-9-2-%E4%B8%80%E8%A1%8C%E4%B8%80%E4%B8%AA%E8%AF%AD%E5%8F%A5%EF%BC%8C%E6%AF%8F%E4%B8%AA%E8%AF%AD%E5%8F%A5%E5%90%8E%E8%A6%81%E6%8D%A2%E8%A1%8C"><span class="nav-number">5.9.2.</span> <span class="nav-text">[红] 2.9.2 一行一个语句，每个语句后要换行</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-9-3-%E5%88%97%E9%99%90%E5%88%B6%EF%BC%9A80%E6%88%96100"><span class="nav-number">5.9.3.</span> <span class="nav-text">[红] 2.9.3 列限制：80或100</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-9-4-%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C"><span class="nav-number">5.9.4.</span> <span class="nav-text">[红] 2.9.4 自动换行</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-9-5-%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%87%86%E5%88%99%E6%98%AF%EF%BC%9A%E6%9B%B4%E5%80%BE%E5%90%91%E4%BA%8E%E5%9C%A8%E6%9B%B4%E9%AB%98%E7%9A%84%E8%AF%AD%E6%B3%95%E7%BA%A7%E5%88%AB%E5%A4%84%E6%96%AD%E5%BC%80"><span class="nav-number">5.9.5.</span> <span class="nav-text">[红] 2.9.5 自动换行的基本准则是：更倾向于在更高的语法级别处断开</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-9-6-%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C%E6%97%B6%E7%BC%A9%E8%BF%9B4%E4%B8%AA%E7%A9%BA%E6%A0%BC"><span class="nav-number">5.9.6.</span> <span class="nav-text">[红] 2.9.6 自动换行时缩进4个空格</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-9-7-Modifiers"><span class="nav-number">5.9.7.</span> <span class="nav-text">[红] 2.9.7 Modifiers</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-2-9-8-%E4%B8%8D%E8%A6%81%E5%9C%A8switch%E4%B8%AD%E5%B5%8C%E5%A5%97switch"><span class="nav-number">5.9.8.</span> <span class="nav-text">[红] 2.9.8 不要在switch中嵌套switch</span></a></li></ol></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#3-%E5%91%BD%E5%90%8D%E7%BA%A6%E5%AE%9A"><span class="nav-number">6.</span> <span class="nav-text">3. 命名约定</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#3-1-Android"><span class="nav-number">6.1.</span> <span class="nav-text">3.1 Android</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-1-1-%E6%8E%A7%E4%BB%B6%E4%BB%A5%E5%8A%9F%E8%83%BD-%E6%8E%A7%E4%BB%B6%E5%91%BD%E5%90%8D"><span class="nav-number">6.1.1.</span> <span class="nav-text">[红] 3.1.1 控件以功能+控件命名</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-1-2-%E5%B8%83%E5%B1%80%E6%96%87%E4%BB%B6%E5%91%BD%E5%90%8D"><span class="nav-number">6.1.2.</span> <span class="nav-text">[红] 3.1.2 布局文件命名</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-1-3-%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6%E5%91%BD%E5%90%8D"><span class="nav-number">6.1.3.</span> <span class="nav-text">[红] 3.1.3 资源文件命名</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-1-4-%E6%8E%A5%E5%8F%A3%E5%91%BD%E5%90%8D"><span class="nav-number">6.1.4.</span> <span class="nav-text">[红] 3.1.4 接口命名</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-2-Java"><span class="nav-number">6.2.</span> <span class="nav-text">3.2 Java</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-1-%E5%8C%85%E5%90%8D%E5%85%A8%E9%83%A8%E5%B0%8F%E5%86%99%EF%BC%8C%E8%BF%9E%E7%BB%AD%E7%9A%84%E5%8D%95%E8%AF%8D%E5%8F%AA%E6%98%AF%E7%AE%80%E5%8D%95%E5%9C%B0%E8%BF%9E%E6%8E%A5%E8%B5%B7%E6%9D%A5%EF%BC%8C%E4%B8%8D%E4%BD%BF%E7%94%A8%E4%B8%8B%E5%88%92%E7%BA%BF"><span class="nav-number">6.2.1.</span> <span class="nav-text">[红] 3.2.1 包名全部小写，连续的单词只是简单地连接起来，不使用下划线</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-2-%E7%B1%BB%E5%90%8D%E9%83%BD%E4%BB%A5UpperCamelCase%E9%A3%8E%E6%A0%BC%E7%BC%96%E5%86%99"><span class="nav-number">6.2.2.</span> <span class="nav-text">[红] 3.2.2 类名都以UpperCamelCase风格编写</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-3-%E6%96%B9%E6%B3%95%E5%90%8D%E9%83%BD%E4%BB%A5lowerCamelCase%E9%A3%8E%E6%A0%BC%E7%BC%96%E5%86%99"><span class="nav-number">6.2.3.</span> <span class="nav-text">[红] 3.2.3 方法名都以lowerCamelCase风格编写</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-3-2-4-%E6%96%B9%E6%B3%95%E5%91%BD%E5%90%8D%E7%BA%A6%E5%AE%9A%EF%BC%9A"><span class="nav-number">6.2.4.</span> <span class="nav-text">[黄] 3.2.4 方法命名约定：</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-5-%E5%B8%B8%E9%87%8F%E5%90%8D%E5%91%BD%E5%90%8D%E6%A8%A1%E5%BC%8F%E4%B8%BACONSTANT-CASE%EF%BC%8C%E5%85%A8%E9%83%A8%E5%AD%97%E6%AF%8D%E5%A4%A7%E5%86%99%EF%BC%8C%E7%94%A8%E4%B8%8B%E5%88%92%E7%BA%BF%E5%88%86%E9%9A%94%E5%8D%95%E8%AF%8D"><span class="nav-number">6.2.5.</span> <span class="nav-text">[红] 3.2.5 常量名命名模式为CONSTANT_CASE，全部字母大写，用下划线分隔单词</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-6-%E9%9D%9E%E5%B8%B8%E9%87%8F%E5%AD%97%E6%AE%B5%E5%90%8D%E4%BB%A5lowerCamelCase%E9%A3%8E%E6%A0%BC%E7%BC%96%E5%86%99"><span class="nav-number">6.2.6.</span> <span class="nav-text">[红] 3.2.6 非常量字段名以lowerCamelCase风格编写</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-7-%E5%8F%82%E6%95%B0%E5%90%8D%E4%BB%A5lowerCamelCase%E9%A3%8E%E6%A0%BC%E7%BC%96%E5%86%99"><span class="nav-number">6.2.7.</span> <span class="nav-text">[红] 3.2.7 参数名以lowerCamelCase风格编写</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-8-%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F%E5%90%8D%E4%BB%A5lowerCamelCase%E9%A3%8E%E6%A0%BC%E7%BC%96%E5%86%99"><span class="nav-number">6.2.8.</span> <span class="nav-text">[红] 3.2.8 局部变量名以lowerCamelCase风格编写</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-9-%E7%B1%BB%E5%9E%8B%E5%8F%98%E9%87%8F%E5%90%8D"><span class="nav-number">6.2.9.</span> <span class="nav-text">[红] 3.2.9 类型变量名</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-10-%E6%89%80%E6%9C%89%E6%A0%87%E8%AF%86%E7%AC%A6%E5%91%BD%E5%90%8D%E5%BF%85%E9%A1%BB%E8%8B%B1%E6%96%87%EF%BC%8C%E4%B8%8D%E5%8F%AF%E4%BB%A5%E6%9C%89%E6%8B%BC%E9%9F%B3"><span class="nav-number">6.2.10.</span> <span class="nav-text">[红] 3.2.10 所有标识符命名必须英文，不可以有拼音</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-11-%E4%B8%8D%E5%8F%AF%E4%BB%A5%E6%9C%89%E6%97%A0%E5%BF%85%E8%A6%81%E7%9A%84%E7%BC%A9%E5%86%99AbsClass-Img%E7%AD%89%E4%B8%8D%E5%85%81%E8%AE%B8%E5%87%BA%E7%8E%B0"><span class="nav-number">6.2.11.</span> <span class="nav-text">[红] 3.2.11 不可以有无必要的缩写AbsClass,Img等不允许出现</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-12-%E6%8A%BD%E8%B1%A1%E7%B1%BB%E5%91%BD%E5%90%8D%E4%BD%BF%E7%94%A8Abstract%E6%88%96Base%E5%BC%80%E5%A4%B4%EF%BC%9B%E5%BC%82%E5%B8%B8%E7%B1%BB%E5%91%BD%E5%90%8D%E4%BD%BF%E7%94%A8Exception%E7%BB%93%E5%B0%BE%EF%BC%9B%E6%B5%8B%E8%AF%95%E7%B1%BB%E5%91%BD%E5%90%8D%E4%BB%A5%E5%AE%83%E8%A6%81%E6%B5%8B%E8%AF%95%E7%9A%84%E7%B1%BB%E7%9A%84%E5%90%8D%E7%A7%B0%E5%BC%80%E5%A7%8B%EF%BC%8C%E4%BB%A5Test%E7%BB%93%E5%B0%BE"><span class="nav-number">6.2.12.</span> <span class="nav-text">[红] 3.2.12 抽象类命名使用Abstract或Base开头；异常类命名使用Exception结尾；测试类命名以它要测试的类的名称开始，以Test结尾</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-13-%E5%A6%82%E6%9E%9C%E4%BD%BF%E7%94%A8%E4%BA%86%E6%9F%90%E7%A7%8D%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%8C%E8%AF%B7%E5%8A%A1%E5%BF%85%E5%9C%A8%E7%B1%BB%E5%90%8D%E4%B8%AD%E4%BD%93%E7%8E%B0"><span class="nav-number">6.2.13.</span> <span class="nav-text">[红] 3.2.13 如果使用了某种设计模式，请务必在类名中体现</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-3-2-14-%E6%8E%A5%E5%8F%A3%E7%B1%BB%E7%9A%84%E6%96%B9%E6%B3%95%E8%A6%81%E5%8A%A0%E6%B3%A8%E9%87%8A%E8%AF%B4%E6%98%8E%EF%BC%8C%E5%B9%B6%E4%B8%94%E4%B8%8D%E9%9C%80%E8%A6%81%E4%BB%BB%E4%BD%95%E4%BF%AE%E9%A5%B0%E8%AF%8D-%E5%A6%82public"><span class="nav-number">6.2.14.</span> <span class="nav-text">[红] 3.2.14 接口类的方法要加注释说明，并且不需要任何修饰词(如public)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-3-2-15-Enum-%E5%91%BD%E5%90%8D%E4%BB%A5Enum%E5%BC%80%E5%A4%B4%EF%BC%8C%E4%B8%94%E6%88%90%E5%91%98%E5%BF%85%E9%A1%BB%E5%85%A8%E5%A4%A7%E5%86%99"><span class="nav-number">6.2.15.</span> <span class="nav-text">[黄] 3.2.15 Enum 命名以Enum开头，且成员必须全大写</span></a></li></ol></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#4-%E7%BC%96%E7%A8%8B%E5%AE%9E%E8%B7%B5"><span class="nav-number">7.</span> <span class="nav-text">4. 编程实践</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#4-1-Android"><span class="nav-number">7.1.</span> <span class="nav-text">4.1 Android</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-1-1-%E5%A6%82%E6%9E%9C%E8%83%BD%E9%80%9A%E8%BF%87xml%E6%8F%8F%E8%BF%B0%E8%A7%A3%E5%86%B3%E7%9A%84drawable%EF%BC%8C%E4%B8%8D%E7%94%A8%E4%BD%BF%E7%94%A8UI%E5%88%87%E5%9B%BE%EF%BC%8C%E4%B8%8D%E8%AE%BA%E6%98%AF%E6%95%88%E7%8E%87%E8%BF%98%E6%98%AF%E6%89%A9%E5%B1%95%E6%80%A7%EF%BC%8Cxml%E6%8F%8F%E8%BF%B0%E7%9A%84drawable%E8%BF%9C%E6%AF%94%E7%94%A8%E5%88%87%E5%9B%BE%E5%A5%BD%E5%BE%88%E5%A4%9A"><span class="nav-number">7.1.1.</span> <span class="nav-text">[红] 4.1.1 如果能通过xml描述解决的drawable，不用使用UI切图，不论是效率还是扩展性，xml描述的drawable远比用切图好很多</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-1-2-%E4%BD%BF%E7%94%A8AdapterView%E7%9A%84%E5%AD%90%E7%B1%BB%E5%92%8CAdapter%E6%97%B6%EF%BC%8C%E5%AE%9E%E7%8E%B0getView%E6%97%B6%EF%BC%8C%E8%A6%81%E6%98%AF%E7%94%A8convertView%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E6%AF%8F%E6%AC%A1%E9%83%BD%E9%87%8D%E6%96%B0%E6%9E%84%E5%BB%BAView"><span class="nav-number">7.1.2.</span> <span class="nav-text">[红] 4.1.2 使用AdapterView的子类和Adapter时，实现getView时，要是用convertView，而不是每次都重新构建View</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-1-3-%E8%AE%BE%E8%AE%A1UI%E6%97%B6%E8%A6%81%E6%B3%A8%E6%84%8F%E9%81%BF%E5%85%8D%E8%BF%87%E5%BA%A6%E7%BB%98%E5%88%B6%EF%BC%8C%E4%B8%8D%E8%83%BD%E5%87%BA%E7%8E%B0%E5%90%8C%E4%B8%80%E4%B8%AA%E5%8C%BA%E5%9F%9F2%E5%80%8D%E4%BB%A5%E4%B8%8A%E7%9A%84%E8%BF%87%E5%BA%A6%E7%BB%98%E5%88%B6"><span class="nav-number">7.1.3.</span> <span class="nav-text">[黄] 4.1.3 设计UI时要注意避免过度绘制，不能出现同一个区域2倍以上的过度绘制</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-1-4-%E6%97%A5%E5%BF%97%E8%A7%84%E8%8C%83"><span class="nav-number">7.1.4.</span> <span class="nav-text">[红] 4.1.4 日志规范</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-1-5-%E5%B1%9E%E6%80%A7%E4%BD%BF%E7%94%A8%E8%A7%84%E8%8C%83"><span class="nav-number">7.1.5.</span> <span class="nav-text">[红] 4.1.5 属性使用规范</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-1-6-%E9%9C%80%E8%A6%81%E4%BD%BF%E7%94%A8%E5%88%97%E8%A1%A8%E6%A0%B7%E5%BC%8F%E7%9A%84UI%E6%97%B6%E4%BC%98%E5%85%88%E4%BD%BF%E7%94%A8RecyclerView%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AFListView"><span class="nav-number">7.1.6.</span> <span class="nav-text">[黄] 4.1.6 需要使用列表样式的UI时优先使用RecyclerView，而不是ListView</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#4-2-%E9%9B%86%E5%90%88"><span class="nav-number">7.2.</span> <span class="nav-text">4.2 集合</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-2-1-Map-Set%E7%9A%84key%E4%B8%BA%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%B9%E8%B1%A1%E6%97%B6%EF%BC%8C%E5%BF%85%E9%A1%BB%E9%87%8D%E5%86%99hashCode%E5%92%8Cequals"><span class="nav-number">7.2.1.</span> <span class="nav-text">[黄] 4.2.1 Map&#x2F;Set的key为自定义对象时，必须重写hashCode和equals</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-2-2-ArrayList%E7%9A%84subList%E7%BB%93%E6%9E%9C%E4%B8%8D%E5%8F%AF%E5%BC%BA%E8%BD%AC%E6%88%90ArrayList%EF%BC%8C%E5%90%A6%E5%88%99%E4%BC%9A%E6%8A%9B%E5%87%BAClassCastException%E5%BC%82%E5%B8%B8"><span class="nav-number">7.2.2.</span> <span class="nav-text">[黄] 4.2.2 ArrayList的subList结果不可强转成ArrayList，否则会抛出ClassCastException异常</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-2-3-%E5%9C%A8subList%E5%9C%BA%E6%99%AF%E4%B8%AD%EF%BC%8C%E9%AB%98%E5%BA%A6%E6%B3%A8%E6%84%8F%E5%AF%B9%E5%8E%9F%E9%9B%86%E5%90%88%E5%85%83%E7%B4%A0%E4%B8%AA%E6%95%B0%E7%9A%84%E4%BF%AE%E6%94%B9%EF%BC%8C%E4%BC%9A%E5%AF%BC%E8%87%B4%E5%AD%90%E5%88%97%E8%A1%A8%E7%9A%84%E9%81%8D%E5%8E%86%E3%80%81%E5%A2%9E%E5%8A%A0%E3%80%81%E5%88%A0%E9%99%A4%E5%9D%87%E4%BA%A7%E7%94%9FConcurrentModificationException%E5%BC%82%E5%B8%B8"><span class="nav-number">7.2.3.</span> <span class="nav-text">[黄] 4.2.3 在subList场景中，高度注意对原集合元素个数的修改，会导致子列表的遍历、增加、删除均产生ConcurrentModificationException异常</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-2-4-%E4%BD%BF%E7%94%A8%E9%9B%86%E5%90%88%E8%BD%AC%E6%95%B0%E7%BB%84%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%8C%E5%BF%85%E9%A1%BB%E4%BD%BF%E7%94%A8%E9%9B%86%E5%90%88%E7%9A%84toArray-T-array-%EF%BC%8C%E4%BC%A0%E5%85%A5%E7%9A%84%E6%98%AF%E7%B1%BB%E5%9E%8B%E5%AE%8C%E5%85%A8%E4%B8%80%E6%A0%B7%E7%9A%84%E6%95%B0%E7%BB%84%EF%BC%8C%E5%A4%A7%E5%B0%8F%E5%B0%B1%E6%98%AFlist-size"><span class="nav-number">7.2.4.</span> <span class="nav-text">[黄] 4.2.4 使用集合转数组的方法，必须使用集合的toArray(T[] array)，传入的是类型完全一样的数组，大小就是list.size()</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-2-5-%E4%BD%BF%E7%94%A8%E5%B7%A5%E5%85%B7%E7%B1%BBArrays-asList-%E6%8A%8A%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E6%88%90%E9%9B%86%E5%90%88%E6%97%B6%EF%BC%8C%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8%E5%85%B6%E4%BF%AE%E6%94%B9%E9%9B%86%E5%90%88%E7%9B%B8%E5%85%B3%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%8C%E5%AE%83%E7%9A%84add-remove-clear%E6%96%B9%E6%B3%95%E4%BC%9A%E6%8A%9B%E5%87%BAUnsupportedOperationException%E5%BC%82%E5%B8%B8"><span class="nav-number">7.2.5.</span> <span class="nav-text">[黄] 4.2.5 使用工具类Arrays.asList()把数组转换成集合时，不能使用其修改集合相关的方法，它的add&#x2F;remove&#x2F;clear方法会抛出UnsupportedOperationException异常</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-2-6-%E4%B8%8D%E8%A6%81%E5%9C%A8foreach%E5%BE%AA%E7%8E%AF%E9%87%8C%E8%BF%9B%E8%A1%8C%E5%85%83%E7%B4%A0%E7%9A%84remove-add%E6%93%8D%E4%BD%9C%E3%80%82remove%E5%85%83%E7%B4%A0%E8%AF%B7%E4%BD%BF%E7%94%A8Iterator-%E6%96%B9%E5%BC%8F%EF%BC%8C%E5%A6%82%E6%9E%9C%E5%B9%B6%E5%8F%91%E6%93%8D%E4%BD%9C%EF%BC%8C%E9%9C%80%E8%A6%81%E5%AF%B9Iterator%E5%AF%B9%E8%B1%A1%E5%8A%A0%E9%94%81"><span class="nav-number">7.2.6.</span> <span class="nav-text">[黄] 4.2.6 不要在foreach循环里进行元素的remove&#x2F;add操作。remove元素请使用Iterator 方式，如果并发操作，需要对Iterator对象加锁</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-2-7-%E4%BD%BF%E7%94%A8entrySet%E9%81%8D%E5%8E%86Map%E7%B1%BB%E9%9B%86%E5%90%88KV%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AFkeySet%E6%96%B9%E5%BC%8F%E8%BF%9B%E8%A1%8C%E9%81%8D%E5%8E%86"><span class="nav-number">7.2.7.</span> <span class="nav-text">[黄] 4.2.7 使用entrySet遍历Map类集合KV，而不是keySet方式进行遍历</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#4-3-%E5%B9%B6%E5%8F%91"><span class="nav-number">7.3.</span> <span class="nav-text">4.3 并发</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-3-1-%E7%BA%BF%E7%A8%8B%E8%B5%84%E6%BA%90%E5%BF%85%E9%A1%BB%E9%80%9A%E8%BF%87%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%8F%90%E4%BE%9B%EF%BC%8C%E4%B8%8D%E5%85%81%E8%AE%B8%E5%9C%A8%E5%BA%94%E7%94%A8%E4%B8%AD%E8%87%AA%E8%A1%8C%E6%98%BE%E5%BC%8F%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%8F%82%E8%80%83%E4%BB%A3%E7%A0%81%EF%BC%9A"><span class="nav-number">7.3.1.</span> <span class="nav-text">[红] 4.3.1 线程资源必须通过线程池提供，不允许在应用中自行显式创建线程，参考代码：</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-3-2-SimpleDateFormat-%E6%98%AF%E7%BA%BF%E7%A8%8B%E4%B8%8D%E5%AE%89%E5%85%A8%E7%9A%84%E7%B1%BB%EF%BC%8C%E4%B8%80%E8%88%AC%E4%B8%8D%E8%A6%81%E5%AE%9A%E4%B9%89%E4%B8%BAstatic%E5%8F%98%E9%87%8F%EF%BC%8C%E5%A6%82%E6%9E%9C%E5%AE%9A%E4%B9%89%E4%B8%BA-static%EF%BC%8C%E5%BF%85%E9%A1%BB%E5%8A%A0%E9%94%81%EF%BC%8C%E6%88%96%E8%80%85%E4%BD%BF%E7%94%A8DateUtils%E5%B7%A5%E5%85%B7%E7%B1%BB"><span class="nav-number">7.3.2.</span> <span class="nav-text">[红] 4.3.2 SimpleDateFormat 是线程不安全的类，一般不要定义为static变量，如果定义为 static，必须加锁，或者使用DateUtils工具类</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-3-3-%E5%90%8C%E6%AD%A5%E8%B0%83%E7%94%A8%E5%BA%94%E8%AF%A5%E5%8E%BB%E8%80%83%E9%87%8F%E9%94%81%E7%9A%84%E6%80%A7%E8%83%BD%E6%8D%9F%E8%80%97%E3%80%82%E8%83%BD%E7%94%A8%E6%97%A0%E9%94%81%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%EF%BC%8C%E5%B0%B1%E4%B8%8D%E8%A6%81%E7%94%A8%E9%94%81%EF%BC%9B%E8%83%BD%E9%94%81%E5%8C%BA%E5%9D%97%EF%BC%8C%E5%B0%B1%E4%B8%8D%E8%A6%81%E9%94%81%E6%95%B4%E4%B8%AA%E6%96%B9%E6%B3%95%E4%BD%93%EF%BC%9B%E8%83%BD%E7%94%A8%E5%AF%B9%E8%B1%A1%E9%94%81%EF%BC%8C%E5%B0%B1%E4%B8%8D%E8%A6%81%E7%94%A8%E7%B1%BB%E9%94%81"><span class="nav-number">7.3.3.</span> <span class="nav-text">[红] 4.3.3 同步调用应该去考量锁的性能损耗。能用无锁数据结构，就不要用锁；能锁区块，就不要锁整个方法体；能用对象锁，就不要用类锁</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-3-4-%E5%AF%B9%E5%A4%9A%E4%B8%AA%E8%B5%84%E6%BA%90%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E3%80%81%E5%AF%B9%E8%B1%A1%E5%90%8C%E6%97%B6%E5%8A%A0%E9%94%81%E6%97%B6%EF%BC%8C%E9%9C%80%E8%A6%81%E4%BF%9D%E6%8C%81%E4%B8%80%E8%87%B4%E7%9A%84%E5%8A%A0%E9%94%81%E9%A1%BA%E5%BA%8F%EF%BC%8C%E5%90%A6%E5%88%99%E5%8F%AF%E8%83%BD%E4%BC%9A%E9%80%A0%E6%88%90%E6%AD%BB%E9%94%81"><span class="nav-number">7.3.4.</span> <span class="nav-text">[红] 4.3.4 对多个资源、数据库表、对象同时加锁时，需要保持一致的加锁顺序，否则可能会造成死锁</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-3-5-%E9%9C%80%E8%A6%81%E4%BD%BF%E7%94%A8%E5%AE%9A%E6%97%B6%E5%99%A8%E6%97%B6%EF%BC%8C%E4%BD%BF%E7%94%A8ScheduledExecutorService%E6%89%A7%E8%A1%8C%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E4%BD%BF%E7%94%A8Timer%E3%80%82%E8%8C%83%E4%BE%8B%EF%BC%9A"><span class="nav-number">7.3.5.</span> <span class="nav-text">[红] 4.3.5 需要使用定时器时，使用ScheduledExecutorService执行定时任务，而不是使用Timer。范例：</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#4-4-%E7%B1%BB"><span class="nav-number">7.4.</span> <span class="nav-text">4.4 类</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-4-1-%E5%8F%AA%E6%9C%89%E4%B8%80%E4%B8%AA%E9%A1%B6%E7%BA%A7%E7%B1%BB%E5%A3%B0%E6%98%8E%EF%BC%8C%E6%AF%8F%E4%B8%AA%E9%A1%B6%E7%BA%A7%E7%B1%BB%E9%83%BD%E5%9C%A8%E4%B8%80%E4%B8%AA%E4%B8%8E%E5%AE%83%E5%90%8C%E5%90%8D%E7%9A%84%E6%BA%90%E6%96%87%E4%BB%B6%E4%B8%AD-%E5%BD%93%E7%84%B6%EF%BC%8C%E8%BF%98%E5%8C%85%E5%90%AB-java%E5%90%8E%E7%BC%80-%E3%80%82"><span class="nav-number">7.4.1.</span> <span class="nav-text">[红] 4.4.1 只有一个顶级类声明，每个顶级类都在一个与它同名的源文件中(当然，还包含.java后缀)。</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-4-2-%E6%89%80%E6%9C%89%E9%87%8D%E5%86%99%E7%9A%84%E6%96%B9%E6%B3%95%E5%BF%85%E9%A1%BB%E5%8A%A0%E4%B8%8A-Override%E7%9A%84%E6%B3%A8%E8%A7%A3"><span class="nav-number">7.4.2.</span> <span class="nav-text">[红] 4.4.2 所有重写的方法必须加上@Override的注解</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-4-3-%E7%B1%BB%E6%88%90%E5%91%98%E9%A1%BA%E5%BA%8F%E8%A6%81%E5%81%9A%E5%88%B0public%E7%9A%84%E6%88%90%E5%91%98%E5%9C%A8%E5%89%8D%EF%BC%8Cprotected%E5%92%8Cprivate%E7%9A%84%E6%88%90%E5%91%98%E4%BE%9D%E6%AC%A1%E6%8E%92%E5%9C%A8%E5%90%8E%E9%9D%A2"><span class="nav-number">7.4.3.</span> <span class="nav-text">[红] 4.4.3 类成员顺序要做到public的成员在前，protected和private的成员依次排在后面</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-4-4-%E7%B1%BB%E6%88%90%E5%91%98%E4%B8%8E%E6%96%B9%E6%B3%95%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E4%BB%8E%E4%B8%A5"><span class="nav-number">7.4.4.</span> <span class="nav-text">[黄] 4.4.4 类成员与方法访问控制从严</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-4-5-%E5%BD%93%E4%B8%80%E4%B8%AA%E7%B1%BB%E6%9C%89%E5%A4%9A%E4%B8%AA%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%EF%BC%8C%E6%88%96%E6%98%AF%E5%A4%9A%E4%B8%AA%E5%90%8C%E5%90%8D%E6%96%B9%E6%B3%95%EF%BC%8C%E8%BF%99%E4%BA%9B%E5%87%BD%E6%95%B0-%E6%96%B9%E6%B3%95%E5%BA%94%E8%AF%A5%E6%8C%89%E9%A1%BA%E5%BA%8F%E5%87%BA%E7%8E%B0%E5%9C%A8%E4%B8%80%E8%B5%B7%EF%BC%8C%E4%B8%AD%E9%97%B4%E4%B8%8D%E8%A6%81%E6%94%BE%E8%BF%9B%E5%85%B6%E5%AE%83%E5%87%BD%E6%95%B0-%E6%96%B9%E6%B3%95%E3%80%82"><span class="nav-number">7.4.5.</span> <span class="nav-text">[红] 4.4.5 当一个类有多个构造函数，或是多个同名方法，这些函数&#x2F;方法应该按顺序出现在一起，中间不要放进其它函数&#x2F;方法。</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#4-5-Java"><span class="nav-number">7.5.</span> <span class="nav-text">4.5 Java</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-1-Override%EF%BC%9A%E8%83%BD%E7%94%A8%E5%88%99%E7%94%A8"><span class="nav-number">7.5.1.</span> <span class="nav-text">[红] 4.5.1 @Override：能用则用</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-2-%E6%8D%95%E8%8E%B7%E7%9A%84%E5%BC%82%E5%B8%B8%EF%BC%9A%E4%B8%8D%E8%83%BD%E5%BF%BD%E8%A7%86"><span class="nav-number">7.5.2.</span> <span class="nav-text">[红] 4.5.2 捕获的异常：不能忽视</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-3-%E9%9D%99%E6%80%81%E6%88%90%E5%91%98%EF%BC%9A%E4%BD%BF%E7%94%A8%E7%B1%BB%E8%BF%9B%E8%A1%8C%E8%B0%83%E7%94%A8"><span class="nav-number">7.5.3.</span> <span class="nav-text">[红] 4.5.3 静态成员：使用类进行调用</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-4-Finalizers-%E7%A6%81%E7%94%A8"><span class="nav-number">7.5.4.</span> <span class="nav-text">[红] 4.5.4 Finalizers: 禁用</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-5-%E4%B8%8D%E8%AE%BA%E4%BD%95%E6%97%B6%EF%BC%8C%E4%B8%8D%E5%85%81%E8%AE%B8%E6%9C%89%E5%8D%95%E8%AF%8D%E6%8B%BC%E5%86%99%E9%94%99%E8%AF%AF%EF%BC%8C%E5%B9%B6%E6%8C%81%E7%BB%AD%E5%85%BC%E5%AE%B9%E8%BF%99%E7%A7%8D%E9%94%99%E8%AF%AF%E6%9C%89%E6%97%B6%E5%80%99%E5%85%B6%E5%AE%9E%E5%B9%B6%E6%B2%A1%E9%82%A3%E4%B9%88%E9%9A%BE"><span class="nav-number">7.5.5.</span> <span class="nav-text">[红] 4.5.5 不论何时，不允许有单词拼写错误，并持续兼容这种错误有时候其实并没那么难</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-6-%E4%B8%8D%E8%AE%BA%E4%BD%95%E6%97%B6%EF%BC%8C%E4%B8%8D%E5%85%81%E8%AE%B8%E5%9C%A8%E4%BB%A3%E7%A0%81%E4%B8%AD%E5%87%BA%E7%8E%B0%E9%AD%94%E6%B3%95%E6%95%B0%E5%AD%97"><span class="nav-number">7.5.6.</span> <span class="nav-text">[红] 4.5.6 不论何时，不允许在代码中出现魔法数字</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-7-%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0%E5%8F%98%E9%87%8F%E5%91%BD%E5%90%8D%E8%A6%81%E6%9C%89%E6%84%8F%E4%B9%89"><span class="nav-number">7.5.7.</span> <span class="nav-text">[红] 4.5.7 函数参数变量命名要有意义</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-8-%E6%9D%A1%E4%BB%B6%E5%88%A4%E6%96%AD%E8%AF%AD%E5%8F%A5%E4%B8%AD%EF%BC%8Cboolean%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%88%A4%E6%96%AD%E6%9D%A1%E4%BB%B6%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8"><span class="nav-number">7.5.8.</span> <span class="nav-text">[红] 4.5.8 条件判断语句中，boolean类型的判断条件不能使用&#x3D;&#x3D;</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-9-%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%8D%E5%85%81%E8%AE%B8%E7%94%A8-%E8%BF%90%E7%AE%97%E7%AC%A6%E8%BF%9B%E8%A1%8C%E6%AF%94%E8%BE%83"><span class="nav-number">7.5.9.</span> <span class="nav-text">[红] 4.5.9 字符串不允许用 &#x3D;&#x3D; 运算符进行比较</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-10-%E4%BB%A3%E7%A0%81%E4%B8%AD%E4%B8%8D%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8%E7%A1%AC%E7%BC%96%E7%A0%81%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2"><span class="nav-number">7.5.10.</span> <span class="nav-text">[红] 4.5.10 代码中不允许使用硬编码的字符串</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-5-11-%E5%B8%B8%E9%87%8F%E7%9A%84%E5%A4%8D%E7%94%A8%E5%B1%82%E6%AC%A1%E6%9C%89%E4%BA%94%E5%B1%82%EF%BC%9A%E8%B7%A8%E5%BA%94%E7%94%A8%E5%85%B1%E4%BA%AB%E5%B8%B8%E9%87%8F%E3%80%81%E5%BA%94%E7%94%A8%E5%86%85%E5%85%B1%E4%BA%AB%E5%B8%B8%E9%87%8F%E3%80%81%E5%AD%90%E5%B7%A5%E7%A8%8B%E5%86%85%E5%85%B1%E4%BA%AB%E5%B8%B8%E9%87%8F%E3%80%81%E5%8C%85%E5%86%85%E5%85%B1%E4%BA%AB%E5%B8%B8%E9%87%8F%E3%80%81%E7%B1%BB%E5%86%85%E5%85%B1%E4%BA%AB%E5%B8%B8%E9%87%8F"><span class="nav-number">7.5.11.</span> <span class="nav-text">[黄] 4.5.11 常量的复用层次有五层：跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-12-%E5%AF%B9%E4%BA%8EXXUtils%E7%B1%BB%E7%BB%9F%E4%B8%80%E5%91%BD%E5%90%8D%E4%B8%BAXXXUtils%E5%B9%B6%E4%B8%94%E5%B0%86%E6%9E%84%E9%80%A0%E5%99%A8%E7%A7%81%E6%9C%89%EF%BC%8C%E6%89%80%E6%9C%89%E7%9A%84%E6%96%B9%E6%B3%95%E9%83%BD%E5%BA%94%E8%AF%A5%E6%98%AFstatic%E7%9A%84%EF%BC%8C%E5%AF%B9%E5%A4%96%E6%9A%B4%E9%9C%B2%E7%9A%84%E6%96%B9%E6%B3%95%E6%98%AFpublic%E7%9A%84-%E5%B9%B6%E4%B8%94%E7%B1%BB%E6%98%AF%E4%B8%8D%E5%8F%AF%E8%A2%AB%E7%BB%A7%E6%89%BF%E7%9A%84%EF%BC%8C%E5%8D%B3"><span class="nav-number">7.5.12.</span> <span class="nav-text">[红] 4.5.12 对于XXUtils类统一命名为XXXUtils并且将构造器私有，所有的方法都应该是static的，对外暴露的方法是public的,并且类是不可被继承的，即:</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-13-%E8%BE%93%E5%85%A5-%E8%BE%93%E5%87%BA%E6%B5%81%E6%89%93%E5%BC%80%E4%B8%80%E5%AE%9A%E8%A6%81%E5%9C%A8finally%E4%B8%AD%E5%85%B3%E9%97%AD%EF%BC%8C%E5%90%A6%E5%88%99%E4%BC%9A%E9%80%A0%E6%88%90%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%EF%BC%8C%E5%8F%82%E8%80%83%E4%BB%A3%E7%A0%81%EF%BC%9A"><span class="nav-number">7.5.13.</span> <span class="nav-text">[红] 4.5.13 输入&#x2F;输出流打开一定要在finally中关闭，否则会造成内存泄漏，参考代码：</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-14-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%BC%96%E7%A8%8B%E6%97%B6%EF%BC%8C%E5%AF%B9%E4%BA%92%E6%96%A5%E8%B5%84%E6%BA%90%E7%9A%84%E4%BF%AE%E6%94%B9%E4%B8%8D%E8%83%BD%E5%90%8C%E6%AD%A5%E8%BF%94%E5%9B%9E%EF%BC%8C%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87Future%E6%96%B9%E5%BC%8F%E8%BF%94%E5%9B%9E%E6%88%96%E8%80%85%E6%8F%90%E4%BE%9Blistener%EF%BC%8C%E4%BD%86%E7%B1%BB%E4%BC%BC%E4%BA%8E%E8%BF%99%E6%A0%B7%E7%9A%84%E4%BB%A3%E7%A0%81%E6%98%AF%E4%B8%8D%E8%A2%AB%E5%85%81%E8%AE%B8%E7%9A%84%EF%BC%9A"><span class="nav-number">7.5.14.</span> <span class="nav-text">[红] 4.5.14 多线程编程时，对互斥资源的修改不能同步返回，可以通过Future方式返回或者提供listener，但类似于这样的代码是不被允许的：</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-15-%E7%B1%BB%E6%9E%84%E9%80%A0%E6%96%B9%E6%B3%95%E7%9A%84%E5%AE%9A%E4%B9%89%E8%A6%81%E5%9C%A8%E4%B8%80%E8%B5%B7%E5%AE%9A%E4%B9%89%EF%BC%8C%E4%B8%8D%E8%83%BD%E9%9A%94%E4%BA%86%E5%87%A0%E4%B8%AA%E6%88%90%E5%91%98%E6%96%B9%E6%B3%95%E5%8F%88%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E6%9E%84%E9%80%A0%E5%99%A8%E3%80%82%E4%BE%8B%E5%A6%82%EF%BC%9A"><span class="nav-number">7.5.15.</span> <span class="nav-text">[红] 4.5.15 类构造方法的定义要在一起定义，不能隔了几个成员方法又定义一个构造器。例如：</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-16-%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E8%A6%81%E6%B3%A8%E6%84%8F%E6%98%AF%E6%97%A0%E5%8F%82%E7%9A%84%EF%BC%81%E4%B8%8D%E5%8F%AF%E4%BB%A5%E5%87%BA%E7%8E%B0-getInstance-context-%E8%BF%99%E6%A0%B7%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%8C%E6%9C%89%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%EF%BC%8C%E5%A6%82%E6%9E%9C%E9%9C%80%E8%A6%81%E5%9C%A8%E4%B8%80%E4%B8%AA%E5%8D%95%E4%BE%8B%E7%B1%BB%E4%B8%AD%E7%94%A8%E5%88%B0context%EF%BC%8C%E8%AF%B7%E4%BD%BF%E7%94%A8application%E7%9A%84context"><span class="nav-number">7.5.16.</span> <span class="nav-text">[红] 4.5.16 单例模式要注意是无参的！不可以出现 getInstance(context);这样的方法，有内存泄漏，如果需要在一个单例类中用到context，请使用application的context</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-17-%E4%B8%8D%E9%80%9A%E8%BF%87%E4%B8%80%E4%B8%AA%E7%B1%BB%E7%9A%84%E5%AF%B9%E8%B1%A1%E8%AE%BF%E9%97%AE%E6%AD%A4%E7%B1%BB%E7%9A%84%E9%9D%99%E6%80%81%E5%8F%98%E9%87%8F%E6%88%96%E8%80%85%E6%96%B9%E6%B3%95"><span class="nav-number">7.5.17.</span> <span class="nav-text">[红] 4.5.17 不通过一个类的对象访问此类的静态变量或者方法</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-5-18-%E5%B0%BD%E9%87%8F%E5%B0%91%E7%94%A8%E5%8F%AF%E5%8F%98%E5%8F%82%E6%95%B0%E7%BC%96%E7%A8%8B%EF%BC%8C%E7%94%A8%E6%95%B0%E7%BB%84%E6%88%96%E8%80%85%E5%AE%B9%E5%99%A8%E6%9B%B4%E7%9B%B4%E8%A7%82"><span class="nav-number">7.5.18.</span> <span class="nav-text">[黄] 4.5.18 尽量少用可变参数编程，用数组或者容器更直观</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-19-%E5%AF%B9%E5%A4%96%E6%9A%B4%E9%9C%B2%E7%9A%84%E9%9D%9Eprivate%E6%96%B9%E6%B3%95%EF%BC%8C%E5%8E%9F%E5%88%99%E4%B8%8A%E4%B8%8D%E5%85%81%E8%AE%B8%E4%BF%AE%E6%94%B9%E5%87%BD%E6%95%B0%E7%AD%BE%E5%90%8D%EF%BC%8C%E5%9C%A8%E5%8F%91%E5%B8%83%E7%9A%84%E6%97%B6%E5%80%99%E8%AF%B7%E4%BB%94%E7%BB%86%E6%A3%80%E6%9F%A5%E6%98%AF%E5%90%A6%E6%9C%89%E6%8B%BC%E5%86%99%E9%94%99%E8%AF%AF%E6%88%96%E8%80%85%E5%8F%82%E6%95%B0%E9%94%99%E8%AF%AF%EF%BC%8C%E5%8E%9F%E5%88%99%E4%B8%8A%E4%B8%8D%E5%85%81%E8%AE%B8%E5%88%A0%E9%99%A4%EF%BC%8C%E4%BF%AE%E6%94%B9%E3%80%82%E5%A6%82%E6%9E%9C%E4%B8%8D%E5%86%8D%E6%8E%A8%E8%8D%90%E4%BD%BF%E7%94%A8%E8%AF%B7%E6%89%93%E4%B8%8A-Deprecated%E6%B3%A8%E8%A7%A3%E5%B9%B6%E6%98%8E%E7%A1%AE%E8%AF%B4%E6%98%8E%E6%96%B0%E6%8E%A5%E5%8F%A3"><span class="nav-number">7.5.19.</span> <span class="nav-text">[红] 4.5.19 对外暴露的非private方法，原则上不允许修改函数签名，在发布的时候请仔细检查是否有拼写错误或者参数错误，原则上不允许删除，修改。如果不再推荐使用请打上@Deprecated注解并明确说明新接口</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-5-20-%E4%B8%8D%E4%BD%BF%E7%94%A8sdk%E6%A0%87%E6%B3%A8%E7%9A%84-Deprecated%E6%96%B9%E6%B3%95"><span class="nav-number">7.5.20.</span> <span class="nav-text">[黄] 4.5.20 不使用sdk标注的@Deprecated方法</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-21-Object%E7%9A%84equals%E6%96%B9%E6%B3%95%E5%AE%B9%E6%98%93%E6%8A%9B%E7%A9%BA%E6%8C%87%E9%92%88%E5%BC%82%E5%B8%B8%EF%BC%8C%E5%BA%94%E4%BD%BF%E7%94%A8%E5%B8%B8%E9%87%8F%E6%88%96%E7%A1%AE%E5%AE%9A%E6%9C%89%E5%80%BC%E7%9A%84%E5%AF%B9%E8%B1%A1%E6%9D%A5%E8%B0%83%E7%94%A8equals"><span class="nav-number">7.5.21.</span> <span class="nav-text">[红] 4.5.21 Object的equals方法容易抛空指针异常，应使用常量或确定有值的对象来调用equals</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-22-%E6%89%80%E6%9C%89%E5%8C%85%E8%A3%85%E7%B1%BB%E5%8F%AA%E8%83%BD%E4%BD%BF%E7%94%A8equals%E8%BF%9B%E8%A1%8C%E6%AF%94%E8%BE%83%E4%B8%8D%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8"><span class="nav-number">7.5.22.</span> <span class="nav-text">[红] 4.5.22 所有包装类只能使用equals进行比较不可以使用&#x3D;&#x3D;</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%BB%84-4-5-23-%E6%9E%84%E9%80%A0%E6%96%B9%E6%B3%95%E4%B8%AD%E4%B8%8D%E5%85%81%E8%AE%B8%E5%8A%A0%E5%85%A5%E4%BB%BB%E4%BD%95%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%EF%BC%8C%E5%A6%82%E6%9E%9C%E9%9C%80%E8%A6%81%EF%BC%8C%E8%AF%B7%E6%94%BE%E5%88%B0init-%E4%B8%AD"><span class="nav-number">7.5.23.</span> <span class="nav-text">[黄] 4.5.23 构造方法中不允许加入任何业务逻辑，如果需要，请放到init()中</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-24-%E4%B8%8D%E5%9C%A8%E5%BE%AA%E7%8E%AF%E4%BD%93%E5%86%85%E8%BF%9B%E8%A1%8C%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%8B%BC%E6%8E%A5%EF%BC%8C%E5%A6%82%E6%9E%9C%E9%9C%80%E8%A6%81%E8%AF%B7%E7%94%A8StringBuilder"><span class="nav-number">7.5.24.</span> <span class="nav-text">[红] 4.5.24 不在循环体内进行字符串的拼接，如果需要请用StringBuilder</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-25-%E6%85%8E%E7%94%A8clone%E5%87%BD%E6%95%B0%E8%BF%9B%E8%A1%8C%E6%8B%B7%E8%B4%9D%EF%BC%8C%E5%AE%83%E6%98%AF%E6%B5%85%E6%8B%B7%E8%B4%9D"><span class="nav-number">7.5.25.</span> <span class="nav-text">[红] 4.5.25 慎用clone函数进行拷贝，它是浅拷贝</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-26-%E5%AF%B9%E4%BA%8E%E5%A6%82%E4%B8%8B%E6%83%85%E5%86%B5%EF%BC%8C%E8%A6%81%E4%BD%BF%E7%94%A8%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%EF%BC%9A"><span class="nav-number">7.5.26.</span> <span class="nav-text">[红] 4.5.26 对于如下情况，要使用单例模式：</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BA%A2-4-5-27-android%E5%AE%8F%E6%8E%A7%E5%88%B6%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%B1%9E%E6%80%A7%E5%90%8D%E7%A7%B0%E5%BA%94%E8%AF%A5%E6%98%AFro-%E5%BC%80%E5%A4%B4-%E5%B1%9E%E6%80%A7%E5%BA%94%E8%AF%A5%E5%BD%93%E5%81%9A%E5%B8%B8%E9%87%8F%E6%9D%A5%E4%BD%BF%E7%94%A8%EF%BC%8C%E4%B8%8D%E7%94%A8%E6%AF%8F%E6%AC%A1%E9%83%BD%E6%9D%A5%E8%AF%BB%E5%8F%96%E5%B1%9E%E6%80%A7%E3%80%82"><span class="nav-number">7.5.27.</span> <span class="nav-text">[红] 4.5.27 android宏控制类型的属性名称应该是ro.开头;属性应该当做常量来使用，不用每次都来读取属性。</span></a></li></ol></li></ol></li></ol></div>
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <img class="site-author-image" itemprop="image" alt="丘山月夜"
      src="/images/avatar.png">
  <p class="site-author-name" itemprop="name">丘山月夜</p>
  <div class="site-description" itemprop="description">君は空を見てるか,<br>風の音を聞いてるか</div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">60</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
            <a href="/categories/">
          
        <span class="site-state-item-count">14</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
            <a href="/tags/">
          
        <span class="site-state-item-count">21</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>



      </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2021</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">丘山月夜</span>
</div>
  <div class="powered-by">由 <a href="https://hexo.io/" class="theme-link" rel="noopener" target="_blank">Hexo</a> & <a href="https://mist.theme-next.org/" class="theme-link" rel="noopener" target="_blank">NexT.Mist</a> 强力驱动
  </div>

        








      </div>
    </footer>
  </div>

  
  <script src="/lib/anime.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>

<script src="/js/utils.js"></script>

<script src="/js/motion.js"></script>


<script src="/js/schemes/muse.js"></script>


<script src="/js/next-boot.js"></script>




  















  

  

</body>
</html>
